2021. 10. 7. 08:00ใBack-End ์์ ์ค/Spring Framework
๐ ๋ชฉ์ฐจ
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
๐ ๋ค์ํ ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
์์กด๊ด๊ณ ์ฃผ์ ์ ํฌ๊ฒ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ด์์.
์ฒซ์งธ. ์์ฑ์ ์ฃผ์
๋์งธ. Setter ์ฃผ์
์ ์งธ. Field ์ฃผ์
๋ท์งธ. ์ผ๋ฐ Method ์ฃผ์
๐ ์์ฑ์ ์ฃผ์
์ด๋ฆ ๊ทธ๋๋ก ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๊ฒ์ด์์.
ํน์ง์ด๋ผ๊ณ ํ๋ค๋ฉด ์์ฑ์ ํธ์ถ์์ ์ ๋ฑ ํ๋ฒ๋ง ํธ์ถ๋๋ฉฐ, ๋ถ๋ณ ํน์ ํ์ ์์กด๊ด๊ณ์์ ์ฃผ๋ก ์ฌ์ฉํ๋ต๋๋ค.
์์ ๊ฐ์ด ์์ฑ์๊ฐ ํ ๊ฐ๋ง ์กด์ฌํ๋ค๋ฉด @Autowired๋ ์๋ต ๊ฐ๋ฅํ๋ต๋๋ค! ์ฐธ๊ณ ๋ก ์ด๊ฑด Spring Bean์๋ง ํด๋นํ๋ ๊ฒ์ด์์.
๐ Setter ์ฃผ์
์์ ์ ์ฃผ์ ์ด๋ผ๊ณ ๋ ํ ์ ์๋๋ฐ, ์์ ์๋ผ๋ ๋จ์ด๋ ๋ค์ด๋ณธ ์ ์ด ์๋๊ฒ์ด์์.
Setter์ฃผ์ ์ ํน์ง์ ์ ํ ํน์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด ๊ด๊ณ์์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ , Java Bean Property ๊ท์ฝ์ Setter Method ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ :
1. @Autowired์ ๊ธฐ๋ณธ ๋์์ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด Exception์ ํฐํธ๋ฆฐ๋ค.
์ฃผ์ ํ ๋์์ด ์์ด๋ ๋์ํ๊ฒ ํ๊ธฐ ์ํด์๋ @Autowired(required = false)๋ก ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
2. Java Property, Java์์๋ ์๋ ๋ถํฐ Filed์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ , Setter์ Getter๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์
์ฝ๊ฑฐ๋, ์์ ํ๋ ๊ท์น์ ๋ง๋ค์๋๋ฐ, ์ด๊ฒ์ Java Bean Property ๊ท์ฝ์ด๋ผ๊ณ ํ๋ค.
๐ Field ์ฃผ์
ํ๋๋ฅผ ํตํด์ ์ฃผ์ ํ๋ ๋ฐฉ์์ ํ๋ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ ๊ฒ์ด์์.
์ด ๋ฐฉ์์ ํน์ง์ Code๊ฐ ๊ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ๊ณ ์ ํ์ง๋ง, ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ Test ํ๊ธฐ๊ฐ ๋งค์ฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์๋ ๊ฒ์ด์์.
๋ํ, DI Framwork๊ฐ ์๋ค๋ฉด ์๋ฌด๊ฒ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ์ด์์.
Application์ ์ค์ Code๊ณผ ๊ด๊ณ ์๋ Test Code
Spring Configuration์ ๋ชฉ์ ์ผ๋ก ํ๋ @Configuration ๊ฐ์ ๊ณณ์์๋ง ํน๋ณํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋๋๋ค.
๐ก ์ฐธ๊ณ :
1. ์์ Java Test Code์๋ ๋น์ฐํ @Autowired๊ฐ ๋์ํ์ง ์๋๋ค. @SpringBootTest์ฒ๋ผ
Spring Container๋ฅผ Test์ ํตํฉํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
2. ์๋ ์ฝ๋์ ๊ฐ์ด @Bean ์์ ๋งค๊ฐ๋ณ์์ ์์กด๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์ . ์๋ ๋ฑ๋ก ์ ์๋ ๋ฑ๋ก๋ Bean์
์์กด ๊ด๊ณ๊ฐ ํ์ํ ๋ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ
๐ ์ฌ์ฉ์ ์ ์(์ผ๋ฐ) Method ์ฃผ์
์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ๋ง๋ Method๋ฅผ ํตํด ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์์ธ ๊ฒ์ด์์.
ํน์ง์ด๋ผ๊ณ ํ๋ค๋ฉด ํ๋ฒ์ ์ฌ๋ฌ Field๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์๋๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํด์.
๐ก ์ฐธ๊ณ :
์์กด ๊ด๊ณ ์๋ ์ฃผ์ ์ Spring Container๊ฐ ๊ด๋ฆฌํ๋ Spring Bean์ด์ด์ผ ๋์
Spring Bean์ด ์๋ Class์์ @Autowired Code๋ฅผ ์ ์ฉํด๋ ์๋ฌด ๊ธฐ๋ฅ๋ ๋์ํ์ง ์์
๐ Option ์ฒ๋ฆฌ
์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ Bean์ด ์๋ค๊ณ ํด๋ ๋์ ์ํค๊ณ ์ถ์ ๋๊ฐ ์๋ ๊ฒ์ด์์.
๊ทธ๋ฐ๋ฐ, @Autowired๋ง ์ฌ์ฉํ๊ฒ ๋๋ฉด required Option์ Default Value๊ฐ true๋ก ๋์ด ์์ด์ ์๋ ์ฃผ์ ๋์์ด ์์ผ๋ฉด Exception์ด ํฐ์ง๋ ๊ฒ์ด์์.
์๋ ์ฃผ์ ๋์์ Option์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ต๋๋ค.
- @Autowired(required=false) : ์์กด ๊ด๊ณ ์๋ ์ฃผ์ ํ ๋์์ด ์์ ๊ฒฝ์ฐ Setter ์์ฒด๊ฐ ํธ์ถ๋์ง ์๋๋ค.
- org.springframwork.lang.@Nullable : ์๋ ์ฃผ์ ๋์์ด ์๋ค๋ฉด null์ด ์ ๋ ฅ๋๋ค.
- Optional<> : ์๋ ์ฃผ์ ๋์์ด ์์ผ๋ฉด Optional.empty๊ฐ ์ ๋ ฅ๋๋ค.
์์์ ์ฌ์ฉํ Member Instance๋ Spring Bean์ด ์๋ ๊ฒ์ด์์.
๋ฐ๋ผ์ setNoBean1()์ @Autowired(requred=false)๋ก ์ค์ ๋์ด ์์ด Method ์์ฒด๊ฐ ์์ ํธ์ถ๋์ง ์๋ ๊ฒ์ด์์.
๐ Test ๊ฒฐ๊ณผ
๐ก ์ฐธ๊ณ :
@Nullable, Optional์ Spring ์ ๋ฐ์ ๊ฑธ์ณ ์ง์.
์ด๊ฒ์ ์์ฑ์ ์๋ ์ฃผ์ ์์ ํน์ Field์๋ง ์ฌ์ฉ๋ ๊ฐ๋ฅ
๐จ๐ซ ๊น์ํ ๊ฐ์ฌ๋์ ์กฐ์ธ
์์ฑ์ ์ฃผ์ ์ ์ ํํ๋ผ!
๊ณผ๊ฑฐ Setter ์ฃผ์ ๊ณผ Field ์ฃผ์ ์ ๋ง์ด ์ฌ์ฉํ๋ค๋ง, ์ต๊ทผ์๋ Spring์ ํฌํจํ DI Framwork ๋๋ถ๋ถ์ด ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ค. ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ถ๋ณ์ด๋ฉฐ, ์ธ๋ถ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
์ฒซ์งธ : ๋๋ถ๋ถ ์์กด๊ด๊ณ ์ฃผ์ ์ ํ๋ฒ ์คํ๋๋ฉด Application ์ข ๋ฃ ์์ ๊น์ง ์์กด ๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ ์ผ์ด ์์ผ๋ฉฐ, ์คํ๋ ค ๋๋ถ๋ถ ์์กด๊ด๊ณ๋ Application์ด ์ข ๋ฃ ๋ ๋๊น์ง ๋ณํ์ง ์๋ ๊ฒ์ด 99%์ ๋ ๋๋ค.
์ฆ, ๋ถ๋ณํด์ผ ํ๋ค.
๋์งธ : Setter ์ฃผ์ ์ฌ์ฉ ์ setXxx Method๋ฅผ public์ผ๋ก ์ด์ด๋์ด์ผ ํ๋ฉฐ, ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ํ์ ํ ๋๋,
๋ค๋ฅธ Client๊ฐ ์์น ์๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ํํ๋ค.
์ ์งธ : ๋๊ตฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝํ ์๋ ์๊ณ , ๋ณ๊ฒฝํ๋ฉด ์๋๋ Method๋ฅผ ์ด์ด๋๋ ๊ฒ์ ์ข์ ์ค๊ณ๊ฐ ์๋๋ค.
๋ท์งธ : ์์ฑ์ ์ฃผ์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ๋ฑ ํ๋ฒ๋ง ํธ์ถ๋๋ฏ๋ก, ์ด ํ ํธ์ถ๋๋ ์ผ์ด ์๊ธฐ์ ๋ถ๋ณํ๊ฒ
์ค๊ณํ ์ ์๋ค.
๐ ๋๋ฝ
Framwork ์์ด ์์ Java Code๋ฅผ ๋จ์ Test ํ๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด Setter ์์กด ๊ด๊ณ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋จ๊น์?
@Autowired๊ฐ framwork ์์์ ๋์ํ ๋ ์์กด๊ด๊ณ๊ฐ ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋, ์๋ Code๋ Framwork ์์ด ์์ Java Code๋ก๋ง ๋จ์ Test๋ฅผ ํ๊ณ ์๋ ๊ฒ์ด์์.
์์ Test ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋์์๊น์? ๋ฐ๋ก NPE(Null Point Exception)์ด ํฐ์ง๋ ๊ฒ์ด์์. ๊ทธ ์ด์ ๋ memberRepository, discountPolicy ๋ชจ๋ ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋๋ฝ ๋์๊ธฐ ๋๋ฌธ์ด๋๋๋ค.
์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์์กด ๊ด๊ณ ์ฃผ์ Data๊ฐ ๋๋ฝ๋์์ ๋, Compile Error๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , IDE์์ ๋ฐ๋ก ์ด๋ค ๊ฐ์ ํ์๋ก ์ฃผ์ ํด์ผ ํ๋์ง ์๋ ค์ค๋ต๋๋ค!
๐ Final Keyword
์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด Field์ final Keyword๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์์. ๊ทธ๋์ ์์ฑ์์์ ํน์๋ผ๋ ๊ฐ์ด ์ค์ ๋์ง ์๋ Error๋ฅผ Compile ์์ ์์ ๋ง์์ฃผ๋ ๊ฒ์ด์์.
์์ฑ์ Body๋ฅผ ์์ธํ ๋ณด๋ฉด ํ์ Field์ธ discountPolicy์ ๊ฐ์ ์ค์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์ด ๋๋ฝ๋ ๊ฒ์ด์์.
Compile Error๋ ์ฌ๋์ด๊ณ , ์ ๋ฐฐ ๊ฐ๋ฐ์๋ค์ ๋ฐฐ๋ ค์ธ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ :
Setter ์ฃผ์ ์ ํฌํจ ๋๋จธ์ง ์ฃผ์ ๋ฐฉ์์ ๋ชจ๋ ์์ฑ์ ์ดํ์ ํธ์ถ๋๋ค.
๋๋ฌธ์ Field์ final Keyword๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ค์ง ์์ฑ์ ์ฃผ์ ๋ฐฉ์์์๋ง final Keyword๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด
์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๊ฐ ์์ง๋ง, Framwork๋ฅผ ์์กดํ์ง ์๊ณ , ์์ Java์ ํน์ง์ ์ ์ด๋ฆฌ๋ ๋ฐฉ๋ฒ์ธ ๊ฒ์ด์์.
๊ธฐ๋ณธ์ผ๋ก ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๊ณ , ํ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ Setter ์ฃผ์ ๋ฐฉ์์ ์ฐจ์ ์ฑ ์ผ๋ก ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ๋ ์๋ ๊ฒ์ด์์. ์ฆ, ๋ ๋ค ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด์ง์.
ํญ์ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ด์์. ๊ทธ๋ฆฌ๊ณ , ๊ฐ๋ ์ฐจ์ ์ฑ ์ด ํ์ํ๋ค๋ฉด Setter ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ต๋๋ค.
Field ์ฃผ์ ์ ๊ทธ๋ฅ ์ด๋ฐ๊ฒ ์๊ตฌ๋ ์ ๋๋ง ์๋ฉด ๋๋ ๊ฒ์ด์์.
๐ Lombok๊ณผ ์ต์ Trand
๊ฐ์ฌ๋๊ป์๋ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๋๋ถ๋ถ ๋ค ๋ถ๋ณ ์ฌํญ์ด๊ณ , ๊ทธ๋์ Field์ final Keyword๋ฅผ ๋ถ์ด๊ฒ ๋๋ค๊ณ ํ์ จ์ด์.
๊ทธ๋ฐ๋ฐ, ์์ฑ์๋ ๋ง๋ค์ด์ผ ํ๊ณ , ์ฃผ์ ๋ฐ์ ๊ฐ์ ๋์ ํ๋ Code๋ ๋ง๋ค์ด์ผ ํ๊ณ , ๋๋ ํ ๊ฒ ๋ง์ ๊ฒ์ด์์.
Field ์ฃผ์ ์ ์ข ๋ ํธํ๊ฒ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์์๊น์?
๊ทธ๋ด ๋ ๋ฑ์ฅํ๋ ๊ฒ์ด ๋ฐ๋ก Lombok์ธ ๊ฒ์ด์์.
Lombok Library๊ฐ ์ ๊ณตํ๋ @RequiredArgsConstructor ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด final์ด ๋ถ์ Field๋ฅผ ๋ชจ์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด์์.
Lombok์ด Java์ Annotion Processor๋ผ๋ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ Compile ์์ ์ ์์ฑ์ Code๋ฅผ ์๋์ผ๋ก ์์ฑํด ์ฃผ๋ ๊ฒ์ด์์. ์ค์ Class๋ฅผ ์ด์ด๋ณด๋ฉด ์์ฑ์๊ฐ ์ถ๊ฐ๋์ด ์๋ต๋๋ค.
์ ๋ฆฌํ์๋ฉด
์ต๊ทผ ์์ฑ์๋ฅผ ๋ฑ ํ๊ฐ๋ฅผ ๋๊ณ , @Autowired๋ฅผ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๋ต๋๋ค.
์ฌ๊ธฐ์ Lombok Library์ @RequiredArgsConstructor๋ฅผ ํจ๊ป ์ด๋ค๋ฉด ์์ ๊ธฐ๋ฅ์ ๋ค ์ธ ์ ์๊ณ , Code ๋ํ ๊น๋ํ๊ฒ ์ ๋ฆฌ๋๋ ํจ๊ณผ๋ฅผ ๋๋ฆด ์ ์๋ ๊ฒ์ด์์.
๐ Lombok ์ ์ฉ ๋ฐฉ๋ฒ
๐ build.gradle
- [Macbook]
preferences => plugin => lombok ๊ฒ์ ๋ฐ ์ค์น (IDE ์ฌ์์ ํ์) - [Windows]
File => Settings => plugin => lombok ๊ฒ์ ๋ฐ ์ค์น (IDE ์ฌ์์ ํ์) - ์์ Test๋ฅผ ๋ง๋ ๋ค @Getter, @Setter๊ฐ ๋์ํ๋ฉด ์ ์
๐ ์กฐํ ๋น 2๊ฐ ์ด์ - ๋ฌธ์
@Autowired๋ ์๋ฃํ Type์ผ๋ก ์กฐํ๋ฅผ ํ๋ ๊ฒ์ด์์.
์๋ฃํ Type์ผ๋ก ์กฐํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์๋ Code์ ์ ์ฌํ๊ฒ ๋์ํ๋ ๊ฒ์ด์์. (๋จ, ์ค์ ๋ ๋ง์ ๊ธฐ๋ฅ ์ ๊ณต)
AnnotationConfigApplicationContext.getBean(AppConfig.class);
์๋ฃํ Type์ผ๋ก ์กฐํ๋ฅผ ํ๊ฒ ๋๋ฉด ์ ํ๋ Bean์ด 2๊ฐ ์ด์์ผ ๋ Exception์ด ํฐ์ง๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ์๋ ์ํ์์ ์์กด ๊ด๊ณ๋ฅผ ์๋ ์ฃผ์ ์ผ๋ก ํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ฐ๋ก๋ฐ๋ก NoUniqueBeanDefinitionException์ด ํฐ์ง๋ ๊ฒ์ด์์.
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available: expected single matching bean
but found 2: fixDiscountPolicy,rateDiscountPolicy
์์ ๋ด์ฉ์ ํด์ ํด๋ณด๋ฉด ํ๋์ Bean์ด ์์ ์ค ์์๋๋ฐ, fixDiscountPolicy์ rateDiscountPolicy 2๊ฐ๋ฅผ ๋ฐ๊ฒฌํด ๋ฒ๋ ธ๋ค๊ณ ํ๋ค์.
์ด ๋, ํ์ ์๋ฃํ Type์ผ๋ก ์ง์ ํ ์๋ ์์ผ๋, ํ์ ์๋ฃํ Type์ผ๋ก ์ง์ ํ๋ ๊ฒ์ DIP ์๋ฐ ์ฌํญ์ด๊ณ , ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ ๊ฒ์ด์์. ์ด๋ฆ๋ง ๋๋ฅด๊ณ , ์์ ํ ๋๊ฐ์ Type์ Spring Bean 2๊ฐ๊ฐ ์์ ๋๋ ๋ ํด๊ฒฐ๋ ์ ๋๋ ๊ฒ์ด์์.
Spring Bean์ ์๋ ๋ฑ๋กํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ ์๊ฒ ์ง๋ง, ์์กด ๊ด๊ณ ์๋ ์ฃผ์ ์์ ํด๊ฒฐํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ ๊ฒ์ด์์.
๐ @Autowired Field Name, @Qualifier, @Primary
์กฐํ ๋์ Bean์ด 2๊ฐ ์ด์์ผ ๋ ๊ทธ๋ผ ์ด๋ป๊ฒ ์๋ ์ฃผ์ ์์ ํด๊ฒฐํ ์ ์์๊น์?
์ฒซ์งธ : @Aurowired Field Name Matching
๋์งธ : @Qualifier => @Qualifier๋ผ๋ฆฌ Matching => Bean Name Matching
์ ์งธ : @Primary ์ฌ์ฉ
๐ @Autowired Field Name Matching
@Autowired๋ ์๋ฃํ Type Matching์ ๋จผ์ ํ ๋ค์ ์ฌ๋ฌ Bean์ด ์์ผ๋ฉด Field Name, ๋งค๊ฐ ๋ณ์ ์ด๋ฆ์ผ๋ก Bean Name์ ์ถ๊ฐ Matching ํ๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ ํ๋ฉด Field Name์ด rateDiscountPolicy์ด๊ธฐ ๋๋ฌธ์ ์ ์ ์ฃผ์ ๋๋ ๊ฒ์ด์์.
ํ๋ ์ด๋ฆ ๋งค์นญ์ ๋จผ์ ์๋ฃํ ํ์ ๋งค์นญ์ ์๋ํ ๋ค ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋น์ด ์์ ๋ ์ถ๊ฐ๋ก ๋์ํ๋ ๊ฒ์ด์์.
์ ๋ฆฌํ์๋ฉด
@Autowired๋ ์๋ฃํ ํ์ ๋งค์นญ์ ํ๋ฉฐ, ๋งค์นญ ๊ฒฐ๊ณผ๊ฐ 2๊ฐ ์ด์์ผ ๋ ํ๋ ์ด๋ฆ, ๋งค๊ฐ ๋ณ์(ํ๋ผ๋ฏธํฐ) ์ด๋ฆ์ผ๋ก ๋น ์ด๋ฆ์ ๋งค์นญํ๋ ๊ฒ์ด์์.
๐ @Qualifier
@Qualifier๋ ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ฃผ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ ๊ฒ์ด์์.
์ฆ, ์์กด ๊ด๊ณ ์ฃผ์ ์ ํ ๋ ์ถ๊ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ด์์. ์ด ์น๊ตฌ๋ ๋น ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋๋๋ค.
์์ ์ฝ๋์ ๊ฐ์ด ๋น ๋ฑ๋ก์ ํ ๋ @Qualifier๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ ๊ฒ์ด๊ณ , ์ฃผ์ ์์ ๋ฑ๋กํ ์ด๋ฆ์ ์ ์ด์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ ์์ฑ์ ์๋ ์ฃผ์ ์์
๐ Setter ์๋ ์ฃผ์ ์์
๋ง์ฝ @Qualifier๋ก ์ฃผ์ ํ ๋ @Qualifier("mainDiscountPolicy")๋ฅผ ๋ชป ์ฐพ๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ทธ๋ ๊ฒ ๋๋ฉด mainDiscountPolicy๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ ์ถ๊ฐ๋ก ์ฐพ๋ ๊ฒ์ด์์.
๐จ๐ซ ๊น์ํ ๊ฐ์ฌ๋์ ์กฐ์ธ
@Qualifier๋ @Qualifier๋ฅผ ์ฐพ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํฉ์๋ค!
์๋ ์ฝ๋์ ๊ฐ์ด ์๋ ๋น ๋ฑ๋ก์์๋ @Qualifier๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์์.
์ ๋ฆฌํ์๋ฉด
์ฒซ์งธ : @Qualifier๋ผ๋ฆฌ ๋งค์นญ
๋์งธ : ๋น ์ด๋ฆ ๋งค์นญ
์ ์งธ : NoSuchBeanDefinitionException ๋ฐ์
๐ @Primary ์ฌ์ฉ
@Primary๋ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ ๊ฒ์ด์์.
@Autowired ์ ์ฌ๋ฌ ๋น์ด ๋งค์นญ๋๋ฉด @Primary๊ฐ ๋ถ์ด์๋ ๊ณณ์ด ์ต์ฐ์ ๊ถ์ ๊ฐ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ํ๋ค๋ฉด FixDiscountPolicy๋ณด๋ค RateDiscountPolicy๊ฐ ์ฐ์ ๊ถ์ ๊ฐ๊ฒ ๋๋ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ฉด @Primary์ @Qualifier ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํ๋ฉด ์ข์๊น์?@Qulifier์ ๋จ์ ์ ์์กด ๊ด๊ณ ์ฃผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ Code์ @Qualifier๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค๋ ๊ฒ์ด์์.
ํ.์ง.๋ง @Primary๋ ์ด๋ด ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์์ง์!
๐ @Primary, @Qualifier ํ์ฉ
์ฝ๋์์ ์์ฃผ ์ฌ์ฉํ๋ Main DB์ Connection์ ํ๋ํ๋ ์คํ๋ง ๋น์ด ์๊ณ , ์ฝ๋์์ ํน๋ณํ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ๋ ํ์ฉํ๋ Sub DB์ Connection์ ํ๋ํ๋ ๋น์ด ์๋ค๊ณ ๊ฐ์ ํ ๋, Main DB์ Connection์ ํ๋ํ๋ ์คํ๋ง ๋น์ธค @Primary๋ฅผ ์ ์ฉํด์ ์กฐํํ๋ ๊ณณ์์ @Qulifier ์ง์ ์์ด ํธ๋ฆฌํ๊ฒ ์กฐํํ๊ณ , Sub DB Connection Bean ํ๋ ์์๋ @Qualifier๋ฅผ ์ง์ ํ์ฌ ๋ช ์์ ์ผ๋ก ํ๋ ํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋ ๊ฒ์ด์์.
๋ฌผ๋ก ์ด ๋ Main DB์ ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋, @Qualifier๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ต๋๋ค!
๊ทธ๋ ๋ค๋ฉด ๋ ์ค ๋๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๊น์?
@Primary๋ Default Value์ฒ๋ผ ๋์ํ๋ ๊ฒ์ด๊ณ , @Qulifier๋ ๋งค์ฐ ์์ธํ๊ฒ ๋์ํ๋ ๊ฒ์ด์์.
์คํ๋ง์ ์๋๋ณด๋ค ์๋์ด ๋์ ๋ฒ์์ ์ ํ๊ถ ๋ณด๋ค๋ ์ข์ ๋ฒ์์ ์ ํ๊ถ์ด ์ฐ์ ์์๊ฐ ๋์ ๊ฒ์ด์์. ๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ @Qualifier๊ฐ ์ฐ์ ๊ถ์ด ๋๋ต๋๋ค!
๐ ์กฐํํ ๋น์ด ๋ชจ๋ ํ์ํ ๋? List์ Map!
์๋์ ์ผ๋ก ํด๋น ์๋ฃํ ํ์ ์ ์คํ๋ง ๋น์ด ๋ชจ๋ ๋ค ํ์ํ ๊ฒฝ์ฐ๋ ์๋ ๊ฒ์ด์์.
์๋ฅผ ๋ค์ด ํ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํ ๋, ํด๋ผ์ด์ธํธ๊ฐ ํ ์ธ์ ์ข ๋ฅ (๊ณ ์ ํ, ํ๋ฅ ํ)์ ์ ํํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด ์คํ๋ง์ ์ฌ์ฉํ์ฌ ์ ๋ต ํจํด์ ๊ตฌํํ ์ ์๋ ๊ฒ์ด์์.
16 ~ 30๋ฒ์งธ Line | 32 ~ 49๋ฒ์งธ Line |
์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด DiscountService๋ Map์ผ๋ก ๋ชจ๋ DiscountOPolicy๋ฅผ ์ฃผ์ ๋ฐ๋ ๊ฒ์ด์์.
์ด ๋, fixDiscountPolicy, rateDiscountPolicy๊ฐ ์ฃผ์ ๋๋ ๊ฒ์ด์์.
discount()๋ discountCode๋ก "fixDiscountPolicy"๊ฐ ๋์ด์ค๋ฉด map์์ fixDiscountPolicy ์คํ๋ง ๋น์ ์ฐพ์ ์คํํ๋ ๊ฒ์ด์์. ๋ฌผ๋ก ! "rateDiscountPolicy"๊ฐ ๋์ค๋ฉด rateDiscountPolicy๋ฅผ ์ฐพ์ ์คํํ๊ฒ ์ง์.
Map<String, DiscountPolicy>๋ map Key์ ์คํ๋ง ๋น์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ๊ณ , ๊ทธ ๊ฐ์ผ๋ก DiscountPolicy ๊ฐ์ฒด ์๋ฃํ ํ์ ์ผ๋ก ์กฐํํ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ด์์ฃผ๋ ๊ฒ์ด์์.
List<DiscountPolicy>๋ DiscountPolicy ๊ฐ์ฒด ์๋ฃํ ํ์ ์ผ๋ก ์กฐํํ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ด์์ฃผ๋ ๊ฒ์ด์์.
๋ง์ฝ ํด๋นํ๋ ์๋ฃํ ํ์ ์ ์คํ๋ง ๋น์ด ์์ผ๋ฉด, ๋น ์ปฌ๋ ์ ์ด๋ Map์ ์ฃผ์ ํ๋ต๋๋ค.
๐ก์ฐธ๊ณ : ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ฉด์ ์คํ๋ง ๋น ๋ฑ๋ก
์คํ๋ง ์ปจํ ์ด๋๋ ์์ฑ์์ ํด๋์ค ์ ๋ณด๋ฅผ ๋ฐ๋๋ค. ์ฌ๊ธฐ์ ํด๋์ค ์ ๋ณด๋ฅผ ๋๊ธฐ๋ฉด ํด๋น ํด๋์ค๊ฐ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค.
new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
์ ์ฝ๋๋ 2๊ฐ์ง๋ก ๋๋์ด ๋ณผ ์ ์๋ค.
์ฒซ์งธ : new AnnotionConfigApplicationContext()๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
๋์งธ : AutoAppConfig.class, DiscountService.class๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋๊ธฐ๋ฉด์ ํด๋น ํด๋์ค๋ฅผ ์๋์ผ๋ก ์คํ๋ง
๋น์ผ๋ก ๋ฑ๋ก
๊ฒฐ๊ตญ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ฉด์, ํด๋น ์ปจํ ์ด๋์ ๋์์ AutoAppConfig, DiscountService๋ฅผ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก
๐ ์๋, ์๋์ ์ฌ๋ฐ๋ฅธ ์ค๋ฌด ์ด์ ๊ธฐ์ค
๐ ํธ๋ฆฌํ ์๋ ๊ธฐ๋ฅ์ด Default!
์ด๋ค ๊ฒฝ์ฐ์ ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์ฃผ์ ์ ์ฌ์ฉํ๊ณ , ์ด๋ค ๊ฒฝ์ฐ์ ์ค์ ์ ๋ณด๋ฅผ ๋ง๋ค์ด์ ์๋์ผ๋ก ๋น์ ๋ฑ๋กํ๊ณ , ์์กด๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์ ํ ๊น์?
๊ฒฐ๊ณผ์ ์ผ๋ก ์คํ๋ง์ด ๋์ค๊ณ , ์๊ฐ์ด ์ง๋ ์๋ก ์๋์ ์ ํธํ๋ ์ถ์ธ๋ผ๊ณ ํฉ๋๋ค.
์คํ๋ง์ @Component ๋ฟ ์๋๋ผ, @Controller, @Service, @Repository์ฒ๋ผ Layer(๊ณ์ธต)์ ๋ง์ถ์ด ์ผ๋ฐ์ ์ธ Application Logic์ ์๋์ผ๋ก Scanํ ์ ์๋๋ก ์ง์ํ๋ ๊ฒ์ด์์.
๊ฑฐ๊ธฐ์ ์ต๊ทผ ์คํ๋ง ๋ถํธ๋ ์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , ์คํ๋ง ๋ถํธ์ ๋ค์ํ ์คํ๋ง ๋น๋ค๋ ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์๋์ผ๋ก ๋ฑ๋ก ๋๋๋ก ์ค๊ณ ํ ๊ฒ์ด์์.
์ค์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Application์ ๊ตฌ์ฑํ๋ ๋ถ๋ถ๊ณผ ์ค์ ๋์ํ๋ ๋ถ๋ถ์ ๋ช ํํ๊ฒ ๋๋๋ ๊ฒ์ด ์ด์์ ์ด๋, ๊ฐ๋ฐ์ ์ ์ฅ์์ ์คํ๋ง ๋น์ ํ๋ ๋ฑ๋กํ ๋, @Component๋ง ๋ฃ์ด์ฃผ๋ฉด ๋๋๋ ์ผ์ @Configuration์ด ๋ถ์ด ์๋ ์ค์ ์ ๋ณด์ ๊ฐ์ @Bean์ Method๋ง๋ค ํ๋ํ๋ ๋ถ์ด๊ณ , ์ธ์คํด์ค(๊ฐ์ฒด)๋ฅผ ์์ฑํ๊ณ , ์ฃผ์ ๋์์ ์ผ์ผ์ด ์ ์ด์ฃผ๋ ๊ณผ์ ์ ํํ๊ฐ ์ค๊ฒ ๋ง๋๋ ๊ฒ์ด์์.
๋ ๊ด๋ฆฌํ ์คํ๋ง ๋น์ด ๋ง์์ ์ค์ ์ ๋ณด๊ฐ ์ปค์ง๊ฒ ๋๋ค๋ฉด ์ค์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ ์์ฒด๋ ๊ต์ฅํ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋ ๊ฒ์ด๋๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๊ฒฐ์ ์ ์ผ๋ก ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํด๋ OCP, DIP๋ฅผ ์๋ฐํ์ง ์์ ์ ์๋ ๊ฒ์ด์์.
๐ ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํ๋ฉด ์ข์ ๋
Application์ ํฌ๊ฒ ์ ๋ฌด ๋ก์ง๊ณผ ๊ธฐ์ ์ง์ ๋ก์ง์ผ๋ก ๋๋ ์ ์๋ ๊ฒ์ด์์.
- ์
๋ฌด ๋ก์ง ๋น : Web์ ์ง์ํ๋ Controller, ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ Service, Data Layer์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ Repository ๋ฑ์ด ๋ชจ๋ ์
๋ฌด ๋ก์ง์ผ๋ก ๋ณดํต ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๊ฐ๋ฐํ ๋ ์ถ๊ฐ๋๊ฑฐ๋, ๋ณ๊ฒฝ๋๋ ๊ณณ์ด๋ค.
- ์ ๋ฌด ๋ก์ง์ ์ซ์๋ ๋งค์ฐ ๋ง๊ณ , ํ๋ฒ ๊ฐ๋ฐํด์ผ ํ๋ฉด Controller, Service, Repository์ฒ๋ผ ์ด๋์ ๋ ์ ์ฌ ํจํด์ด ์กด์ฌ. ์ด๋ฐ ๊ฒฝ์ฐ ์๋ ๊ธฐ๋ฅ์ด ์ ๋ฆฌํ๋ฉฐ, ๋ณดํต ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ์ด๋ค ๊ณณ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ช ํํ๊ฒ ํ์ ํ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ด๋ค.
- ๊ธฐ์ ์ง์ ๋น : ๊ธฐ์ ์ ์ธ ๋ฌธ์ , ๊ณตํต ๊ด์ฌ์ฌ(AOP - ์ด๊ฒ์ ์ ๋ชจ๋ฅด์ ๋ค๋ฉด [Spring Boot] AOP์ ๊ด์ฌ์ ์ฃผ์ธ์!)๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ. DB ์ฐ๊ฒฐ, ๊ณตํต Log ์ฒ๋ฆฌ์ ๊ฐ์ ์
๋ฌด ๋ก์ง์ ์ง์ํ๊ธฐ ์ํ ํ๋ถ ๊ธฐ์ ํน์ ๊ณตํต ๊ธฐ์ ๋ค
- ๊ธฐ์ ์ง์ ๋ก์ง์ ์
๋ฌด ๋ก์ง๊ณผ ๋น๊ตํด์ ๊ทธ ์๊ฐ ๋งค์ฐ ์ ๊ณ , ๋ณดํต Application ์ ๋ฐ์ ๊ฑธ์ณ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ณณ. ๋ํ, ์
๋ฌด ๋ก์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋, ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ๋ช
ํํ๊ฒ ์ ์ ์์ผ๋, ๊ธฐ์ ์ง์ ๋ก์ง์ ์ ์ฉ์ด ์ ๋๊ณ ์๋์ง ์๋์ง ํ์
ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋๋ฌธ์ ์ด๋ฐ ๊ธฐ์ ์ง์ ๋ก์ง๋ค์ ์๋ ๋น ๋ฑ๋ก์ด ์ ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ช
ํํ๊ฒ ์ ์ ์๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค.
- ๊ฐ์ ์ฃผ์ ๋ฅผ ๊ฐ์ Class๋ค์ ํ Package์ ์ ๋ฆฌํ๊ธฐ
- ์ต์์ ์์น (Root Path)์ ์ค์ ์ ๋ณด๋ค์ ์์น ์ํค๊ธฐ.
- ๊ธฐ์ ์ง์ ๋ก์ง์ ์
๋ฌด ๋ก์ง๊ณผ ๋น๊ตํด์ ๊ทธ ์๊ฐ ๋งค์ฐ ์ ๊ณ , ๋ณดํต Application ์ ๋ฐ์ ๊ฑธ์ณ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ณณ. ๋ํ, ์
๋ฌด ๋ก์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋, ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ๋ช
ํํ๊ฒ ์ ์ ์์ผ๋, ๊ธฐ์ ์ง์ ๋ก์ง์ ์ ์ฉ์ด ์ ๋๊ณ ์๋์ง ์๋์ง ํ์
ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋๋ฌธ์ ์ด๋ฐ ๊ธฐ์ ์ง์ ๋ก์ง๋ค์ ์๋ ๋น ๋ฑ๋ก์ด ์ ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ช
ํํ๊ฒ ์ ์ ์๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค.
Application์ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ธฐ์ ์ง์ ์ธ์คํด์ค๋ ์๋ ๋น์ผ๋ก ๋ฑ๋กํด์ ์ค์ ์ ๋ณด์ ๋ฐ๋ก ๋ํ๋๊ฒ ํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ์ ๋ฆฌํ ๊ฒ์ด์์.
๐ ๋น์ฆ๋์ค ๋ก์ง ์ค ๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ ๋
์์กด ๊ด๊ณ ์๋ ์ฃผ์ ์์ ์์ ๊ธฐ์ ํ [๐ ์กฐํํ ๋น์ด ๋ชจ๋ ํ์ํ ๋? List์ Map!] ์ด ๋ถ๋ถ์ ๋ค์ ๊ด์ฌ์ ์ฃผ์ธ์!
DiscountService๊ฐ ์์กด ๊ด๊ณ ์๋ ์ฃผ์ ์ผ๋ก Map<String, DiscountPolicy>์ ์ฃผ์ ์ ๋ฐ๋ ์ํฉ์ด๋ผ๋ฉด ์ฌ๊ธฐ์ ์ด๋ค ๋น๋ค์ด ์ฃผ์ ๋ ์ง ๊ฐ ๋น๋ค์ ์ด๋ฆ์ ๋ฌด์์ผ์ง ์ฝ๋๋ง ๋ณด๊ณ ํ๋ฒ์ ์ ์ ์๋ ๊ฒ์ด์์. ๋ฌผ๋ก ๊ฐ์ธ์ด ๊ฐ๋ฐํ๋ค๋ฉด ์ ์ ์๊ฒ ์ง๋ง, ๋จ์ด ๊ฐ๋ฐํ ์ฝ๋๋ฅผ ๋ฐ๋๋ค๋ฉด ์ด๋จ๊น์?
์ด๋ด ๊ฒฝ์ฐ ์๋ ๋ฑ๋ก์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํ์ ์ ์ํด ์ฌ๋ฌ ์ฝ๋๋ฅผ ์ฎ๊ฒจ ๋ค๋๋ฉฐ, ํ์ ์ ํด์ผ ํ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ ์ํฉ์ผ ๋, ์๋ ๋น์ผ๋ก ๋ฑ๋กํ๊ฑฐ๋, ์๋์ผ๋ก ํ๋ค๋ฉด ํน์ ํจํค์ง์ ๊ฐ์ด ๋ฌถ์ด ๋๋ ๊ฒ์ด ์ข์ ๊ฒ์ด์์.
ํต์ฌ์ ๋ฑ ๋ณด๊ณ , ์ดํด๊ฐ ๋์ด์ผ ํ๋๊น์!
์ด ๋ถ๋ถ์ ๋ณ๋ ์ค์ ์ ๋ณด๋ฅผ ๋ง๋ค๊ณ , ์๋์ผ๋ก ๋ฑ๋กํ๋ค๊ณ ํ๋ฉด ์๋์ ๊ฐ์ ๊ฒ์ด์์.
์ ์ค์ ์ ๋ณด๋ง ๋ด๋ ํ ๋์ ๋น์ ์ด๋ฆ์ ๋ฌผ๋ก (rateDiscountPolicy, fixDiscountPolicy) ์ด๋ค ๋น๋ค์ด ์ฃผ์ ๋ ์ง ํ์ ํ ์ ์๋ ๊ฒ์ด์์. (Method์ Body๋ถ) ๊ทธ๋๋ ๋น ์๋ ๋ฑ๋ก์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ์ ํ๊ธฐ ์ข๊ฒ DiscountPolicy์ ๊ตฌํ ๋น๋ค๋ง ๋ฐ๋ก ๋ชจ์ ํน์ Package์ ์ ์ฅํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ผ ์ ์๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ :
์คํ๋ง๊ณผ ์คํ๋ง ๋ถํธ๊ฐ ์๋์ผ๋ก ๋ฑ๋กํ๋ ์ ๋ง์ ๋น๋ค์ ์์ธ.
์ด๋ฐ ๋ถ๋ถ๋ค์ ์คํ๋ง ์์ฒด๋ฅผ ์ ์ดํดํ๊ณ , ์คํ๋ง์ ์๋๋๋ก ์ ์ฌ์ฉํ๋ ๊ฒ ์ค์.
์คํ๋ง ๋ถํธ์ ๊ฒฝ์ฐ DataSource ๊ฐ์ DB Connection์ ์ฌ์ฉํ๋ ๊ธฐ์ ์ง์ ๋ก์ง๊น์ง ๋ด๋ถ์์ ์๋์ผ๋ก ๋ฑ๋ก.
์ด๋ฐ ๋ถ๋ถ์ Manual์ ์ฐธ๊ณ ํด์ ์คํ๋ง ๋ถํธ๊ฐ ์๋ํ๋๋ก ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ ์ข๋ค.
๋ฐ๋ฉด ์คํ๋ง ๋ถํธ๊ฐ ์๋๋ผ ๋ด๊ฐ ์ง์ ๊ธฐ์ ์ง์ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ๋ ์๋์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ ์ ๋ฆฌ
์ ๋ฆฌํ์๋ฉด
ํธ๋ฆฌํ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋จ ๊ธฐ๋ณธ!
์ง์ ๋ฑ๋กํ๋ ๊ธฐ์ ์ง์ ๊ฐ์ฒด๋ ์๋์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ด ์ข๋ค.
๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์๋ ๋ฑ๋ก์ ๊ณ ๋ฏผํด๋ณด์!
(๋คํ์ฑ์ด ๋ฌด์์ธ์ง ์๊ณ ์ถ์ผ์ ๋ค๋ฉด [Java] ๋คํ์ฑ(polymorphism)์ ๊ด์ฌ์ ์ฃผ์ธ์!)
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์
จ๋์? ๊ตฌ๋
๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช
๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค.
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Bean Scope (0) | 2021.10.10 |
---|---|
[Spring] Bean Life Cycle Call Back (0) | 2021.10.08 |
[Spring] Component Scan And Auto wired Start (0) | 2021.10.06 |
[JPQL] left ( outer ) join (0) | 2021.10.05 |
[JPA] @ManyToOne (0) | 2021.10.05 |