์คํ๋ง์ ํต์ฌ ๊ฐ์น๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ด๋ผ๋ ๊ฒ์ด๋ค.
์คํ๋ง ํ๋ ์์ํฌ
- ํต์ฌ ๊ธฐ์ : DI, AOP
- ์น ๊ธฐ์ : MVC, WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ : DBC,ORM, XML
- ๊ธฐ์ ํตํฉ : ์บ์, ์ด๋ฉ์ผ, ์ค์ผ์ฅด๋ง
- ํ ์คํธ : ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
์คํ๋ง ๋ถํธ
- ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์
- ์น ์๋ฒ(tomcat)๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น ์๋ฒ๊ฐ ํ์ํ์ง ์๋ค
- starter ์ข ์์ฑ ์ ๊ณต
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ๊ตฌ์ฑ
์คํ๋ง์ ํต์ฌ
- ์๋ฐ ์ธ์ด ๊ธฐ๋ฐ์ ํ๋ ์ ์ํฌ
- ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ
์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ช
๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์
์ฌ๋ฌ๊ฐ์ ๋
๋ฆฝ๋ ๋จ์, ์ฆ ๊ฐ์ฒด๋ค์ ๋ชจ์์ผ๋ก ํ์
์๋ก ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค -> ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ
์ด์ ์์ ์๋์ฐจ์ ๊ด๊ณ๋ฅผ ์๊ฐํด๋ณด์ ์ด์ ์๋ ์๋์ฐจ๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง ๋ชฐ๋ผ๋ ์ด์ ๊ฐ๋ฅํ๊ณ ์๋์ฐจ๊ฐ ๋ค๋ฅธ ์๋์ฐจ๋ก ๋ฐ๋์ด๋ ์ด์ ์ด ๊ฐ๋ฅํ๋ค ์ฆ, ์ด์ ์์๊ฒ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
๊ณต์ฐ์ ๋ฌด๋๋ ์๊ฐํด๋ณด๋ฉด ๋ก๋ฏธ์ ์ค๋ฆฌ์ฃ์ด๋ผ๋ ์ญํ ์ด ์กด์ฌํ๋ ๊ฒ์ด๋ฏ๋ก ํด๋น ๋ฐฐ์ญ์ ๋ฐ๋์ด๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
์ญํ : ์ธํฐํ์ด์ค ๊ตฌํ : ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด ๊ฐ์ฒด ์ค๊ณ ์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ ๋ถ๋ฆฌํ๋ค.
์๋ฐ์ ๋คํ์ฑ์ ์ค๋ฒ๋ผ์ด๋ฉ์ผ๋ก ์ ๊ณตํ๋ค
ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค. -> ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ
- SRP : ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility principle) ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ง๋ค ์ฑ ์์ ํฌ๊ธฐ์ ๋ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค ex) UI ๋ณ๊ฒฝ, ๊ฐ์ฒด ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ
- OCP : ๊ฐ๋ฐฉ ํ์ ์์น (Open/Closed principle) ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค ๋คํ์ฑ์ ํ์ฉํ๋ฉด ๋๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค
- LSP : ๋ฆฌ์ค์ฝํ ์นํ ํ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผํ๋ค. ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค.
- ISP : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค. -> ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค. ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ -> ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ
- DIP : ์์กด๊ด๊ณ ์ญ์ ์์น (dependency Inversion) ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค. ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ์๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป ์ญํ ์ ์ง์ค์ ํ์
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
์ ์ฝ๋๋ OrderServiceImpl์ ์ฝ๋ ์ค ํ ๋ถ๋ถ์ธ๋ฐ
ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝ์ผ๋ก DiscountPolicy์ ๊ตฌํ์ฒด๋ค์ ๋ณ๊ฒฝ, ์ฆ ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ฃผ์ด์ผํ๋ค. ๋คํ์ฑ์ ํตํด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
ํ์ง๋ง DIP๋ ์๋ฐํ๊ณ ์๋ค. OrderService๋ ํ์ฌ ์ถ์(์ธํฐํ์ด์ค)์ธ DiscountPolciy๋ฅผ ์์กดํ๊ณ ์๋ค(Okay), ํ์ง๋ง ๊ตฌํ์ฒด์ธ Fix,RateDsicountPolicy์๋ ์์กดํ๊ณ ์์ผ๋ฏ๋ก DIP๋ฅผ ์ค์ํ์ง ๋ชปํ๊ณ ์๋ค.
๋ฎค์ง์ปฌ์ด๋ผ๊ณ ํ๋ฉด ๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ์ ์ญํ ์ด ์๋๋ฐ ๋ก๋ฏธ์ค๊ฐ ์ค์ค๋ก ์ค๋ฆฌ์ฃ์ด ๋๊ตฌ์ธ์ง๋ฅผ ๊ณ ๋ฅด๊ณ ์๋ ์ค์ด๋ค. DIP๋ฅผ ์๋ฐํ๊ณ ๋ก๋ฏธ์ค์ ์ญํ ์ธ์ ๋ค์ํ ์ฑ
์์ ๊ฐ์ง๊ณ ์๋ค.private DiscountPolicy discountPolicy;
์ด DiscountPolicy์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํด์ฃผ๊ณ ์ฃผ์
์ ํด์ค์ผํ๋ค.
์์ฑ์์์๋ ๊ตฌํ์ฒด์ ์ฃผ์
๋ฐ์ผ๋ฉด ๋๋ค.
AppConfig๋ฅผ ๋ง๋ค์ด์ค๋ค.
AppConfig๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ๋์์ ํ์ํ *๊ตฌํ๊ฐ์ฒด*๋ฅผ ์์ฑํ๋ค.
์์ฑํ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๋ฅผ *์์ฑ์๋ฅผ ํตํด์ ์ฃผ์
*ํ๋ค.
AppConfig๋ ์บ์คํ
๋งค๋์ ๋ค. ๋ฐฐ์ฐ๋ค์ ์๋ ์ญ์ด ๋๊ฐ ์ค๋ ์๊ด์ด ์์ด์ผ ํ๋ฏ๋ก AppConfig๊ฐ ๋ค ๋ฐฐ์ญ์ ๊ณจ๋ผ์ค๋ค.
์ด์ OrderServiceImpl์ ์์กด๊ด๊ณ์ ๋ํ ๊ณ ๋ฏผ์ ์ธ๋ถ์ ๋งก๊ธฐ๊ณ ์คํ์๋ง ์ง์คํ๋ฉด ๋๋ค.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService(){
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
ํ์ง๋ง ์์ ์ฝ๋์์ Repository์ ์ญํ ์ด ์ ๋ณด์ด์ง ์๋๋ค.
๋ฆฌํฉํ ๋ง์ ํด๋ณด์
private static MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
new MemoryMemberRepoitory๋ฅผ ์์ฑํ๊ฒ ๋ฐ๋ก ๋นผ์ฃผ๊ณ
new FixDiscountPolicy๋ก ๋ฐ๋ก ๋นผ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ์๊ตฌ์ฌํญ ์ค๊ณ์ ์ ๋ง๋๋ค.- AppConfig๋ฅผ ํตํด ๊ด์ฌ์ฌ๋ฅผ ํ์คํ๊ฒ ๋ถ๋ฆฌํ๋ค. ์ฌ์ฉ์์ญ๊ณผ ๊ตฌ์ฑ์์ญ์ผ๋ก ๋๋์ด์ก๋ค.
๋คํ์ฑ๋ง์ผ๋ก OCP, DIP๋ฅผ ๋ง์กฑํ ์ ์๋ค
- ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ์ํ ์๋ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๊ณ ์คํํ๋ค. ์ฆ, ๊ตฌํ ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ค์ค๋ก ์กฐ์ข ํ๋ค.
- AppConfig๋ฅผ ์ฌ์ฉํ ์ดํ๋ก, ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋นํ๋ค. ํ๋ก๊ทธ๋จ ์ ์ด๋ AppConfig๊ฐ ๊ฐ์ ธ๊ฐ๋ค.
ํ๋ก๊ทธ๋จ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ ์ด๋ผ๊ณ ํ๋ค.
ํ๋ ์์ํฌ : ๋ด๊ฐ ์์ฑํ ์ฝ๋์ ๋ํ ์คํ๊ณผ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ด๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋นํ๋ค.
- ์์กด๊ด๊ณ๋ ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ,๋ฐํ์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด ๊ด๊ณ ์ด ๋๊ฐ๋ฅผ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผํ๋ค.
- ํด๋์ค ์์กด๊ด๊ณ : import ์ฝ๋๋ง ๋ณด๊ณ ํ๋จ ๊ฐ๋ฅํด์ผ ํ๋ค. ์ฝ๋๋ง ๋ณด๋ฉด ํด๋น ๊ตฌํ์ฒด์ ์ด๋ค ํด๋์ค๊ฐ ๋ค์ด๊ฐ์ง ๋ชจ๋ฅธ๋ค. ์ด๋ ์คํ ์๊ฐ์ ๋์ ์ผ๋ก AppConfig๋ฅผ ํตํด ๊ฒฐ์ ๋๋ฉฐ ์ด ๋ ์์กด๊ด๊ณ๊ฐ ์์ฑ๋๋ฉฐ, ์ด๋ฅผ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
IoC, Di Container -> AppConfig ๊ฐ์ด ์์กด์ฑ ์ฃผ์ ํด์ฃผ๋ ๊ฑฐ
- ApplicationContext : ์คํ๋ง ์ปจํ ์ด๋
- @Bean์ด ๋ถ์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํด์ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ณ , ์ด๋ฅผ ์คํ๋ง ๋น์ด๋ผ๊ณ ํ๋ค.
- applicationContext.getBean()์ ํตํด ์คํ๋ง ๋น์ ์ฐพ๋๋ค
๋น ํฉํ ๋ฆฌ
- ์คํ๋ง ์ปจํ ์ด๋ ์ต์์ ์ธํฐํ์ด์ค
- ์ค๋ฅดํ ๋น ๊ด๋ฆฌ ๋ฐ ์กฐํ
- getBean()
ApplicationContext
- ๋น ํฉํ ๋ฆฌ๋ฅผ ์์๋ฐ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ค
- ๋ฉ์ธ์ง ์์ค๋ฅผ ํ์ฉํ ๊ตญ์ ํ ๊ธฐ๋ฅ : ์ธ์ด ๊ตญ์ ํ ๊ธฐ๋ฅ
- ํ๊ฒฝ๋ณ์ : ๋ก์ปฌ,๊ฐ๋ฐ,์ด์๋ฑ์ ๊ตฌ๋ถํด์ ์ฒ ;
- ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฒคํธ : ์ด๋ฒคํธ ๋ฐํ,๊ตฌ๋ ๋ชจ๋ธ์ ํธ๋ฆฌํ๊ฒ ์ง์
- ํธ๋ฆฌํ ๋ฆฌ์์ค ์กฐํ
์ฐ๋ฆฌ๊ฐ ์ฌํ๊น์ง ๋ง๋ค์๋ ๊ฒ์ ์คํ๋ง์ด ์๋ ์์ํ DI ์ปจํ ์ด๋๋ค. ์ฆ, ์์ฒญ์ ํ ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ํ ๋น์ ํ๋ค ๋ง์ฝ ์์ฒญ์ด ์ด ๋น 100์ด๋ผ๋ฉด, ์ด ๋น 100๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ก ์์ฑ์ด ๋๋ ๊ฒ์ด๋ฉฐ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ผ๊ธฐํ๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋น ๊ฐ์ฒด๋ฅผ ๋จ 1๊ฐ๋ง ์์ฑํ๊ณ , ์ด๋ฅผ ๊ณต์ ํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
ํด๋์ค์ ์ธ์คํด์ค๊ฐ Only 1๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด์ด๋ค.
๋ฌธ์ ์
- ์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๋ค -> DIP ์๋ฐ, OCP ์๋ฐ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค
- ๋ด๋ถ ์์ฑ ๋ณ๊ฒฝ ๋ฐ ์ด๊ธฐํ๊ฐ ์ด๋ ต๋ค
- ์์ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค
- ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค
ํ์ง๋ง ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ง์์ ์์์ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค์ด์ค๋ค. ๊ทธ๋์ ์ด์ ์์ฒญ์ด ์ฌ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๋ ๊ฒ์ด ์๋ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฒ์ ์ฌ์ฌ์ฉํด์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๊ธฐ๋ณธ ์ค์ ์ ์ฑ๊ธํค์ด์ง๋ง ์์ฒญํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๊ฒ ์ค์ ํ ์ ์๋ค.
- ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- Therefore
- ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค
- ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค
- ๊ฐ๊ธ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผํ๋ค
- ํ๋ ๋์ ์๋ฐ์์ ๊ณต์ ๋์ง ์๋ ,์ง์ญ๋ณ์, ํ๋ผ๋ฉํฐ ,์ฐ๋ ๋๋ฝ ๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.
์คํ๋ง ๋น์ ํ๋์์ ๊ณต์ ๊ฐ์ ์ค์ ํ๋ฉด ์ ๋ง ํฐ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์คํ๋ง์ ํญ์ ๋ฌด์ํ๋ก ์ค๊ณ๋ฅผ ํ์
private int price; // ์ํ๋ฅผ ์ ์งํ๋ ํ๋
public void order(String name,int price){
System.out.println("name = " + name + ", price = " + price);
this.price = price;
}
--> X
// private int price -> X
public int order(String name,int price){
System.out.println("name = " + name + ", price = " + price);
return price;
}AppConfig <- AppConfig@CGLIB ์คํ๋ง ์ปจํ ์ด๋์๋ ์ธ์คํด์ค ๊ฐ์ฒด๊ฐ AppConfig@CGLIB์ด ๋ฑ๋ก๋๋ค.
-
์ด ์์์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ฑ๊ธํค์ด ๋ณด์ฅ๋๋๋ก ํด์ค๋ค.
-
@Bean์ด ๋ถ์ ๋ฉ์๋๋ง๋ค ์ด๋ฏธ ์คํ๋ง ๋น์ด ์กด์ฌํ๋ฉด ์กด์ฌํ๋ ๋น์ผ๋ก ๋ฐํํ๊ณ , ์คํ๋ง ๋น์ด ์์ผ๋ฉด ์์์ป์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ๋ฐํํ๋ ์ฝ๋๊ฐ ๋์ ์ผ๋ก ๋ง๋ค์ด์ง๋ค.
-
@Configuration ์์ด @Bean๋ง ์ฌ์ฉํ๋ฉด ์์ํ ๊ฐ์ฒด์ธ AppConfig ๊ฐ์ฒด๊ฐ ๋ฑ๋ก์ด ๋๋ค -> ์ฑ๊ธํค์ด ๊นจ์ง๋ค ( ๋ณด์ฅ์ด ์๋๋ค) : ์์กด๊ด๊ณ ์ฃผ์ ์ด ํ์ํด์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ๋ -> ์์ํ ์๋ฐ ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ ๊ทธ๋ฅ ์ค์ ์ ๋ณด๊ฐ ์๋ ๊ณณ์๋ ํญ์ Configuration์ ๋ฃ์
ConfigurationTest๋ฅผ ํ๋ค๊ฐ ๊ฐ์ ์ฒ๋ผ memberRepository๊ฐ ๋์ผํ์ง ์๊ณ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋์์๋ค. ๋ฌธ์ ๊ฐ ๋ญ์๋์ง ์ฐพ๋ค๊ฐ ๋์ AppConfig ํด๋์ค์์ MemberRepository๊ฐ static์ผ๋ก ์ ์ธ์ด ๋์ด์์๋ค(์คํ์๋ค)
๋ฌผ๋ก @Bean์ ์ฐ๊ณ ๋ฐ์ static์ ์ฐ๋ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค. static์ ์ปดํ์ผ ํ์์ ์ฌ๋ฆฌ๋ ๊ฒ์ด๊ณ @Bean์ ๋ฑ๋ก์ ํ๋ ๊ฒ์ ๋ฐํ์์์ ๊ฒฐ์ ์ด ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋์ static์ผ๋ก ๋ ๋ฉ์๋๋ @Bean์ ์จ๋ proxy๋์ง๊ฐ ์์์ ์ฐํํด์ ์์ํ ์๋ฐ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ค. ๊ทธ๋์ ์์กด์ฑ ์ฃผ์ ์ด ๋์ง ์์ผ๋ฏ๋ก ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋์ค๋ ๊ฒ์ด๋ค.
์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋ ์ฃผ์ ์ฌํ๊น์ง ์ฐ๋ฆฌ๋ @Bean์ด๋ XML์ ํตํด ์ค์ ์ ๋ณด์ ์ง์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ๋์ดํ์๋ค.
์คํ๋ง์ ๋น์ด ๋ง์์ง์๋ก ๋ฐ๋ณต ์ฝ๋๋ ๋ง์์ง๊ธฐ ๋๋ฌธ์ ์คํ๋ง์์ ์๋์ผ๋ก ๋น์ผ๋ก ๋ฑ๋กํ๋ ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํด๋ณด์.
- @Configuration ์๋์ @ComponentScan์ ์ถ๊ฐํ์ ์ฌํ๊น์ง ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฌ ์์ ์ ์ฌ๋ฌ๊ฐ์ @Configuration์ด ์๋๋ฐ ์ด ๊ฒ๋ ์ค์บ๋๋ฉด์ ๋ฑ๋ก์ด ๋๋ฏ๋ก ๋นผ์ฃผ์ด์ผํ๋ค
-> excludeFilters = @ComponentScan.Filter(type= FilterType./ANNOTATION/,classes = Configuration.class)
- @Component๊ฐ ๋ถ์ ํด๋์ค๋ฅผ ์ค์บํด์ Bean์ ๋ฑ๋กํ๋ค
- ์ฐ๋ฆฌ๋ ์๋ AppConfig์์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ์๋ค. ํ์ง๋ง ์ด์ ๋ ์ปดํฌ๋ํธ๋ฅผ ํตํด ์๋์ผ๋ก ๋น์ ์ฌ๋ฆฐ๋ค. ๊ทธ๋ฌ๋ฉด ์์กด ๊ด๊ณ ์ฃผ์ ์ ์ด๋ป๊ฒ ํ ์ ์์ ๊น??
-> ์๋ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ๊ฐ๋ฅํ๋๋ก ์์ฑ์์ @Autowired ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
-
์คํ๋ง ๋น์ ๊ธฐ๋ณธ์ด๋ฆ์ ํด๋์ค๋ช ์ ์ฌ์ฉํ๋ ๋งจ ์๊ธ์๋ง ์๋ฌธ์๋ก ๋ณ๊ฒฝํ๋ค.
-
MemberServiceImpl -> memberServiceImpl
-
์ง์ ์ง์ ๋ ๊ฐ๋ฅํ๋ค @Component(โ์ด๋ฆโ)
-
์์ฑ์์ @Autowired๋ฅผ ์ง์ ํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค.
-
๊ธฐ๋ณธ ์กฐํ ์ ๋ต์ ํ์ ์ด ๊ฐ์ ๋น์ ์ฐพ๋๋ค.
-
์๋ ์ปดํฌ๋ํธ ์ค์บ ์ basePackages๋ฅผ ํตํด ์ค์บ ์์ํ๋ ์์น๋ฅผ ์ ํด์ค ์ ์๋ค. ์์ผ๋ฉด ๋ชจ๋ ์๋ฐ ์ฝ๋๋ฅผ ๋ค ํ์ํด์ผํ๋ค.
-
basePackagesClass๋ฅผ ํตํด ํน์ ํด๋์ค๋ถํฐ ์ฐพ์ ์ ์๋ค
- ๋ง์ฝ์ ํด๋์ค๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด?? -> @ComponentScan์ ๋ถ์ธ ํจํค์ง๋ถํฐ ์์ํ๋ค.
๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ์ค์ ์ ๋ณด ํด๋์ค์ ์์น๋ฅผ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋ ๊ฒ
์ฒ์์ ํ๋ก์ ํธ ๋ง๋ค๋ฉด ์ต์๋จ์ ์๋ CoreApplication์ด ๋ณด์ผ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ SpringbootApplication์ด ์๋๋ฐ ์ฌ๊ธฐ์ ๋ค์ด๊ฐ๋ณด๋ฉด ComponentScan์ด ์กด์ฌํ๋ค.
- @Component : ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉ
- @Controller : ์คํ๋ง MVC ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ
- @Service: ์คํ๋ง ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉ
- @Reposiotry : ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์์ ์ฌ์ฉ
- @Configuration : ์คํ๋ง ์ค์ ์ ๋ณด์์ ์ฌ์ฉ
์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก -> ์ถฉ๋ ์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก -> ์๋ ๋น์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค ์๋๋น์ ์ค๋ฒ๋ผ์ด๋ฉ ํด๋ฒ๋ฆฐ๋ค.
์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
- ์์ฑ์ ์ฃผ์ : ์์ฑ์ ํธ์ถ ์์ ์ 1๋ฒ๋ง ํธ์ถ๋๋ ๊ฒ์ ๋ณด์ฅ. ์์ฑ์๊ฐ ๋จ ํ๊ฐ๋ง ์์ผ๋ฉด @Autowired๋ฅผ ๋นผ๋ ๋๋ค.
- ์์ ์(Setter) ์ฃผ์ : ์๋ ํ๋๋ฅผ ์์ ํ ๋๋ setํ๋๋ช ์ผ๋ก ์ด๋ค. ์ฌ๊ธฐ์ Autowired๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ ํ, ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- ํ๋ ์ฃผ์ : ์ค์ ํ๋์ ๋ฐ๋ก ์ฃผ์ ์ ์ํค๋ ๊ฒ. ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
- ์ฃผ์ ํ ์คํ๋ง ๋น์ด ์์ด๋ ๋์ํด์ผ ํ ๋๊ฐ ์๋ค.
- @Autowired(required = false)๋ก ์ง์
- ์์กด๊ด๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ์ด ๋์ง ์๋๋ค.
- @Nullable : ํธ์ถ์ ๋์ง๋ง ๋ฐํ ๊ฐ์ null
- @Optional<> : Optional.empty
๋ถ๋ณ ๋จผ์ ๋๋ถ๋ถ์ ์์กด๊ด๊ณ๋ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์ ๊น์ง ๋ณ๊ฒฝํ์ง ์๋๊ฒ ์ข๋ค.
์์ ์ ์ฃผ์ ์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ฉด ํด๋น ๋ฉ์๋๋ฅผ public์ผ๋ก ๊ณต๊ฐ๋ฅผ ํด์ผํ๋ค.
๋๋ฝ ํ๋ ์์ํฌ ์์ด ์์ํ๊ฒ ์๋ฐ ์ฝ๋๋ก ๋จ์ ํ ์คํธ๋ฅผ ํ๋ ๊ฒฝ์ฐ ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์์ํ ์๋ฐ ์ฝ๋ ํ ์คํธ์์ ๊ฐ ์ฝ๋์ ์์กด์ฑ์ ์์๋ณด๊ธฐ ์ด๋ ต๋ค.
๋ง์ฝ์ ์์ฑ์ ์ฃผ์ ์ผ๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค๋ฉด ์ปดํ์ผ ๋จ์์ ์ค๋ฅ๊ฐ ๋ฐ ๊ฒ์ด๋ค.
final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค final ํค์๋๋ ํ๋ฒ๋ง ์ ๋ ฅ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์์ฑ์ ์ฃผ์ ์ ํตํด final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ฐ. ๊ทธ๋ฆฌ๊ณ ์์ฑ์์์ ์ฝ๋๊ฐ ๋๋ฝ์ด ๋์๋ค๋ฉด ๋ด๊ฐ ํด๋น ์์ฑ์ ๋ณ์๋ฅผ final๋ก ์ง์ ํ์ผ๋ฉด ์ปดํ์ผ ๋จ์์ ์ค๋ฅ๋ฅผ ํ์ธํ ์ ์๋ค.
Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ getter๋ setter ์ฝ๋๋ฅผ ์ง์ง ๋ง์.
- @Getter, @Setter ์ฌ์ฉํ๋ฉด ๋!!!
- @RequiredArgsConstructor : ๋ด ํด๋์ค ๋ด์ final ๋ณ์๋ค์ ๊ฐ์ง๊ณ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ค๋ค.
- ์ด ๋ ๋ณ์ ๋์ดํ๋ ๊ฑฐ์ ์ ์ํด์ผ ํ ๋ฏ. ๋ด๊ฐ ๋ณ์ ๋์ดํ ๋๋ก ์์ฑ์๊ฐ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค์์ ํธ์ถํ ์ ํด๋น ์์๋๋ก ์์ฑํด์ผํ๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ค์๋ DiscountPolicy๋ฅผ ๋ณด๋ฉด ํด๋น ์ถ์ํ์ ๊ตฌํ์ฒด๋ก RateDiscountPolicy์ FixDiscountPolicy๊ฐ ์๋ค. ์ฌ๊ธฐ์ ๋ ์ ์ฑ ์ @Component๋ก ๋ฑ๋ก์ ํ๋ฉด ์กฐํ ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
์ ๋ฌธ์ ๋ฅผ ํ์ ํ์ ์ ์ง์ ์ง์ ํด์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง -> ์ด๊ฒ์ DIP๋ฅผ ์๋ฐํ๊ณ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
- @Autowired ํ๋ ๋ช ๋งค์นญ Autowired๋ ๋จผ์ ํ์ ๋งค์นญ์ ์๋ํ๊ณ , ์ด๋ ์ฌ๋ฌ ๋น์ด ์์ผ๋ฉด ํ๋ ๋ช , ํ๋ผ๋ฉํฐ ๋ช ์ผ๋ก ๋น ์ด๋ฆ์ ์ถ๊ฐ ๋งค์นญํ๋ค.
์ฆ ์์ฑ์์ ํ๋ผ๋ฉํฐ ๋ช ์ ๋ด๊ฐ ์ํ๋ ํด๋์ค์ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ๋ฉด ๋๋ค. discountPolicy -> rateDiscountPolicy 2. @Qualifier -> @Qualifier๋ผ๋ฆฌ ๋งค์นญ ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ฃผ๋ ๋ฐฉ๋ฒ. ์ถ๊ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ด์ง ๋น ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ค. 3. @Primary ์ฌ์ฉ : ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ. ํด๋น ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์๋ ๊ตฌํ์ฒด๊ฐ ๋น์ผ๋ก ์ ํ๋๋ค.
์ฝ๋์์ ์์ฃผ ์ฌ์ฉํ๋ ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฅ์ ์ ํ๋ํ๋ ์คํ๋ง ๋น์ด ์๊ณ , ์ฝ๋์์ ํน๋ณํ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ๋ ์ฌ์ฉํ๋ ์๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ํ๋ํ๋ ์คํ๋ง ๋น์ด ์๋ค๊ณ ํ ๋, ๋ฉ์ธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ @Primary, ์๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ @Qualifier๋ฅผ ์ง์ ํด์ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋ค.
์ฐ์ ์์์ ๊ฒฝ์ฐ Quailfier๊ฐ ๋ ๋๋ค.
- Qualifier(โ์ด๋ฆโ) ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ฌธ์์ด์ ๊ฒฝ์ฐ ์ปดํ์ผ ํ์์์ ์ค๋ฅ๊ฐ ๊ฒ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ด ์๋ชป๋ค์ด๊ฐ๋ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋น ์ด๋ฆ์ Annotation์ผ๋ก ์ ์๋ฅผ ํ๋ฉด๋๋ค.
๊ทธ ๋ค๋ก ํด๋น ์ด๋ ธํ ์ด์ ์ด ํ์ํ ํด๋์ค๋ ํ๋์ @์ด๋ฆ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
Annotation์ ์์์ ๊ฐ๋ ์ด ์๋ค. ๊ทธ๋ฅ ์ด๋ ธํ ์ด์ ์ ํฉ์ณ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์คํ๋ง์์ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๋ค.
์์ ์์๋ก ์ฐ๋ฆฌ๊ฐ ํ ์ธ ์ ์ฑ ์ด 2๊ฐ ๋ค ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
public int discount(Member member,int price ,String discountCode){
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
Map์ ์ฌ์ฉํด์ ์์กด์ฑ ์ฃผ์
์ ๋ฐ์ ๋ 2๊ฐ์ ํ ์ธ ์ ์ฑ
๋น์ ๋ชจ๋ ๋ฐ๊ณ , ํน์ ๋น์ ์ฐพ์ ๋๋ Map.get์ ํตํด ์ฐพ๋๋ค.๋จผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฌด์ ๋ํด์ ์์์ผ ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌด๋ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
- ๋น์ฆ๋์ค ๋ก์ง ๋น : ์น์ ์ง์ํ๋ ์ปจํธ๋กค๋ฌ, ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค, ๋ฐ์ดํฐ ๊ณ์ธต์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ์ด ๋น์ฆ๋์ค ๋ก์ง์ด๋ค. ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๊ฐ๋ฐํ ๋ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ค.
- ๊ธฐ์ ์ง์ ๋น: ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ ๊ณตํต ๊ด์ฌ์ฌ(AOP)๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ๊ณตํต ๋ก๊ทธ ์ฒ๋ฆฌ ์ฒ๋ผ ์ ๋ฌด ๋ก์ง์ ์ง์ํ๊ธฐ ์ํ ํ๋ถ ๊ธฐ์ ์ด๋ ๊ณตํต ๊ธฐ์ ์ด๋ค.
-
๋น์ฆ๋์ค ๋ก์ง์ ๊ฒฝ์ฐ, ์ด๋ ์ ๋ ์ ์ฌํ ํจํด์ด ์์ด์, ์๋ ๊ธฐ๋ฅ์ ์ ๊ทน ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
-
๊ธฐ์ ์ง์ ๋ก์ง์ ์๊ฐ ์ ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ๊ฑธ์ณ์ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น์ง๋ง, ์ ์ฉ์ด ์ ๋๊ณ ์๋ ์ง ํ์ ํ๊ธฐ ์ด๋ ค์ ๊ฐ๊ธ์ ์๋ ๋น์ผ๋ก ๋ฑ๋กํด์ ๋ช ํํ ๋๋ฌ๋ด๋ ๊ฒ์ด ์ข๋ค.
-
๋ฌผ๋ก ๋น์ฆ๋์ค ๋ก์ง์์๋ ๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ๋ค๋ฉด ์๋ ๋น์ผ๋ก ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์๋ฅผ ๋ค์ด DiscountService์ ์ฝ๋๋ง ๋ณด๊ณ ํ ์ธ ์ ์ฑ ์ ๋ฌด์จ ์ ์ฑ ์ด ์๋ ์ง ํ๋ฒ์ ์์์ฐจ๋ฆฌ๊ธฐ๊ฐ ์ด๋ ต๋ค. ์ด๋ด ๋ ์๋์ผ๋ก 2๊ฐ์ ํ ์ธ ์ ์ฑ ์ ๋ฑ๋กํด์ ์์๋ณด๊ธฐ ์ฝ๊ฒ ํ ์ ์๊ณ , ์๋์ผ๋ก ์ถ๊ฐํ ๊ฒฝ์ฐ ํน์ ํจํค์ง์ ๊ฐ์ด ๋ฌถ์ด ๋๋๊ฒ์ด ์ข๋ค.
์คํ๋ง ๋น์ ์ด๋ฒคํธ ๋ผ์ดํ ์ฌ์ดํด ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ -> ์คํ๋ง ๋น ์์ฑ -> ์์กด๊ด๊ณ ์ฃผ์ -> ์ด๊ธฐํ ์ฝ๋ฐฑ -> ์ฌ์ฉ -> ์๋ฉธ ์ ์ฝ๋ฐฑ -> ์คํ๋ง ์ข ๋ฃ
? : ๊ทธ๋ฅ ์์ฑ์์ ๋ค ๋๋ ค ๋ฐ์ผ๋ฉด ๋๋๊ฑฐ ์๋๊ฐ์?? -> ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ด๊ธฐํ๋ฅผ ๋ถ๋ฆฌํฉ์๋ค!!!
- ์ฑ๊ธํค ๋น์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฑ ์์ ์ ๋ฉ์๋๊ฐ ์คํ๋์ง๋ง ํ๋กํ ํ์ ์คํ๋ง ๋น์ ์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ ์กฐํํ ๋ ์์ฑ๋๊ณ , ์ด๊ธฐํ ๋ฉ์๋๋ ์คํ๋๋ค.
- ์ฑ๊ธํค ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ๋น์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ์คํ๋์ง๋ง, ํ๋กํ ํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ , ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ ๊น์ง๋ง ๊ด์ฌํ๊ณ ์ดํ ๊ด๋ฆฌํ์ง ์๋๋ค. ๋ฐ๋ผ์ ํ๋กํ ํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ @PreDestroy ๊ฐ์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ์คํ ๋์ง ์๋๋ค.
ํ๋กํ ํ์ ๋น
- ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฒญํ ๋ ๋ง๋ค ์๋ก ์์ฑ
- ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ , ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ๊น์ง๋ง ๊ด์ฌํ๋ค.
- ์ข ๋ฃ ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฑ๊ธํค ๋น์ด ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ป๊ฒ ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ์์๊น? -> ObjectProvider<>์ ์ฌ์ฉํ์ ObjectProvider์ getObject()๋ฅผ ํธ์ถํ๋ฉด ๋ด๋ถ์์๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํด๋น ๋น์ ์ฐพ์์ ๋ฐํํ๋ค.(โDependency Lookupโ)
- ์น ํ๊ฒฝ์์๋ง ๋์
- ํด๋น ์ค์ฝํ์ ์ข ๋ฃ ์์ ๊น์ง ๊ด๋ฆฌ๋ฅผ ํด์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
์ข ๋ฅ
- Request : HTTP ์์ฒญ ํ๋๊ฐ ๋ค์ด์ค๊ณ ๋๊ฐ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ, ์์ฒญ๋ง๋ค ๋ณ๋์ ๋น ์ธ์คํด์ค๊ฐ ์์ฑ
- Session : HTTP Session๊ณผ ๋์ผ ์๋ช ์ฃผ๊ธฐ
- Application : ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋์ผ ์๋ช ์ฃผ๊ธฐ
- Websocket : ์น ์์ผ๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ
UUID : Universally Unique Identifier : ์ฌ์ฉ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ID, ๊ฒน์น ์ผ์ด ์๋ค
- @Scope(โrequestโ) : ๋น์ HTTP ์์ฒญ ๋น ํ๋์ฉ ์์ฑ๋๊ณ , HTTP ์์ฒญ์ด ๋๋๋ ์์ ์ ์ข ๋ฃ๋๋ค.
์๋ฌด๊ฒ๋ ์ถ๊ฐํ์ง ์๊ณ @Scope(โrequestโ)๋ฅผ ์ฌ์ฉํ๊ณ ์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ ๊ฒ์ด๋ค. WHY? : ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ์์ ์ ์ฑ๊ธํค ๋น์ ์์ฑํด์ ์ฃผ์ ์ด ๊ฐ๋ฅํ์ง๋ง, request ์ค์ฝํ ๋น์ ์์ง ์์ฑ๋์ง ์๋๋ค(์กฐํ ์ ์์ฑ!!). ์ด ๋น์ ์ค์ ๊ณ ๊ฐ์ ์์ฒญ์ด ์์ผ ์์ฑํ ์ ์๋ค.
ํด๊ฒฐ๋ฐฉ์
- Provider : provider๋ฅผ ์ฌ์ฉํด์ ๋น์ ์์ฒญํ๋ ์๊ฐ์ ์ง์ฐ์ํค์.
- ProxyMode : ํ๋ก์๋ชจ๋๋ก ์ค์ ํ๋ฉด ๋ด๊ฐ ์ํ๋ ํด๋์ค์ ๊ฐ์ง ํ๋ก์ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋๊ณ HTTP request์ ์๊ด ์์ด ๊ฐ์ง ํ๋ก์ ํด๋์ค๋ฅผ ๋ค๋ฅธ ๋น์ ๋ฏธ๋ฆฌ ์ฃผ์ ํ ์ ์๋ค.
- Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) : ์คํ๋ง ์ปจํ ์ด๋๋ CGLIB ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์, ๋ด๊ฐ ๋ง๋ ํด๋์ค๋ฅผ ์์๋ฐ์ ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.(๋คํ์ฑ์ ์๋ฆฌ!)
- ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๋ ์์ฒญ์ด ์ค๋ฉด ๊ทธ ๋ ๋ด๋ถ์์ ์ง์ง ๋น์ ์์ฒญํ๋ ์์ ๋ก์ง์ด ์๋ค
์์ํ ์๋ฐ ์ฝ๋๋ก ์ง ๋ค์ ๊ฐ์ฒด ์งํฅ์ ์์น์ ์งํค๋ ๊ฒ๊ณผ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ์๋ ๊ธฐ๋ฅ์ ํตํด ๊ฐ์ฒด ์งํฅ์ ์์น์ ์งํค๋ ๊ฒ์๋ ๊ต์ฅํ ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ๋ค.
๋ํ ์คํ๋ง์ด ๊ฐ๋ฐ์๋ค์ด ๊ฐ๋ฐํ๊ธฐ ํธํ๊ฒ ์ต๋ํ ๊ฐ์ฒด ์งํฅ์ ๋ฐฉํฅ์ ์ ์งํ๋ฉด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ธ์ ๊น์๋ค.
๋ชจ๋ ๊ธฐ๋ฅ์ DI(I0C)๋ OCP ๋ฑ์ ๊ฐ๋ ์ด ์ ๋ฐ์ ์ผ๋ก ๋ค ์ ์ฉ์ด ๋์ด์๋ ๊ฒ ๊ฐ๋ค.
์ฒ์์ ์คํ๋ง ์ ๋ฌธ + MVC ๊ฐ์๋ฅผ ๋ค์์ ๋ Controller -> Service -> Repository ํจํด์ผ๋ก ์ง๊ณ @์ด๋ฐ๊ฑฐ๋ฅผ ๋ถ์ด๋ฉด ์์์ ๋ค ์ฐ๊ฒฐ๋๋ ๊ณผ์ ์ด ์ ์ดํด๊ฐ ์๊ฐ๊ณ ๋จ์ํ ์คํ๋ง์ด ๊ด๋ฆฌ๋ฅผ ํ๋ค ์ ๋๋ก๋ง ์ดํดํ๋๋ฐ, ์ด๋ฒ ๊ฐ์๋ฅผ ํตํด ์ข ๋ ๊น์ ์คํ๋ง์ ๋ํด ๋ฐฐ์ฐ๋ฉด์ ์, ์ด๋ป๊ฒ ํด๋น ๊ธฐ๋ฅ๋ค์ ์ง์ํ๋์ง์ ๋ํด ํ์ตํด์ ๋ค์ ์ถํ์ MVC ํจํด๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋ฐฐ์ธ ๋ ๋ณด๋ค ์์ํ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ์ ํ์ตํ๋ฉด์ ์ด์ ์ ๋ ํฌ์ธํธ๋ why ์๋ค. ํด๋น ๊ธฐ์ ์ด ์ ๋ฑ์ฅํ๊ณ , ์ ์ด๋ฌํ ๊ฐ๋ ์ ์ ์ฉ์ํค๊ณ , ์ ์ฌ์ฉํ๋์ง ๋ฑ์ด ์๋ ๊ฒ ๊ฐ๋ค.
์คํ๋ง์ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ๋ค.
- ์๋ฐ์ ๊ฐ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ทผ๋ณธ์ ์ธ ์์น์ ์ค์ํ๊ธฐ ์ํ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ๋์ด์ค๋ค
- ์คํ๋ง ์ปจํ ์ด๋, ๋น ๋ฑ์ ํตํด ๊ฐ์ฒด ๊ด๋ฆฌ๋ฅผ ๋ณด๋ค ์์ํ๊ฒ ํด์ฃผ๊ณ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํด์ฃผ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅ์ฑ์ ๊ธฐ์ฌ๋ฅผ ํด์ค๋ค.
์์ง ๋ฐฑ์๋ ์ธ์ด๋ก ๋ค๋ฅธ ๊ฒ๋ค์(ํ์ด์ฌ,,) ์ฌ์ฉํด๋ณด์ง๋ ์์์ง๋ง ์คํ๋ง์ ๋ฐฐ์ฐ๋ฉด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋งค๋ ฅ์ ๋น ์ ธ๋ค์ด ๊ณ์ ์คํ๋ง์ ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค.