์คํ๋ง์ ์ ์ฌ์ฉํ๋๊ฐ?
์๋ฐ ํด๋์ค๋ ์คํ๋ง ํด๋์ค๋
๊ฑฐ์ ๋น์ทํ์ง ์์๊น? ๋ผ๊ณ ์๊ฐํ๋ค๋ฉด
์ด๋ฒ ํฌ์คํ ์ผ๋ก์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์์๋ณด์!
1. ์๋ฐ ํด๋์ค
- ์๋ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ์ด๋ค.
- ํด๋์ค ๋ด๋ถ์๋ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ณ์์ ํ๋์ ๋ํ๋ด๋ ๋ฉ์๋๊ฐ ์ ์๋์ด์๋ค.
- ๊ฐ๋ฐ์๋ ํ์ํ ๋ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํด์ ์ฌ์ฉํ๋ค.
- ์์ ์ฝ๋_ ์นดํ ์ฌ์ฅ๋์ด ์ปคํผ๋ฅผ ๋ง๋ค๋๋ง๋ค ๋งค๋ฒ ๋จธ์ ์ ๊ตฌ์ ํด์ ๋ง๋ค์ด์ค์.
// 1. ์คํ ํด๋์ค
// ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด ๊ฐ์ฅ ๋จผ์ Main ํด๋์ค์ main ๋ฉ์๋๋ฅผ ์ฐพ๋๋ค.
public class Main {
public static void main(String[] args) {
// 2. ์ผ๋จ ์นดํ๋ฅผ ์ง์ ์ฐจ๋ ค์ผ(new) ํ๋ค.
// ๊ทธ๋์ ์ปดํจํฐ๋ Cafe ํด๋์ค์ ์์ฑ์ Cafe()๋ก ์ด๋ํ๋ค. -> 3๋ฒ์ผ๋ก ์ด๋
Cafe myCafe = new Cafe();
// 7. ์ฐจ๋ ค์น ์นดํ(myCafe)์์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ค. -> 8๋ฒ์ผ๋ก ์ด๋
myCafe.orderCoffee();
}
}
public class Cafe {
private CoffeeMachine coffeeMachine;
// 3. 2๋ฒ์ ์ํด ํธ์ถ๋์๋ค.
// Cafe ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด์ง๋ฉด์ ์ด ์์ฑ์๊ฐ ์คํ๋๋ค.
public Cafe() {
// 4. ์นดํ ๋ด๋ถ์์ ์ฌ์ฉํ ์ปคํผ ๋จธ์ ์ ์ง์ ์๋ก ๊ตฌ๋งค(new)ํฉ๋๋ค.
// ์ปดํจํฐ๋ CoffeeMachine ํด๋์ค์ ์์ฑ์๋ก ์ด๋ํฉ๋๋ค. -> 5๋ฒ์ผ๋ก ์ด๋
this.coffeeMachine = new CoffeeMachine();
// 6. [CoffeeMachine ๊ฐ์ฒด ์์ฑ ์๋ฃ] ๋จธ์ ์ด ์ ๋ฐฐ์น๋์์ผ๋ Cafe ์์ฑ์์์ ๋๊ฐ๋ค.
// ๋ค์ Main ํด๋์ค์ 2๋ฒ ์ค๋ก ๋์๊ฐ๊ณ ๊ทธ ๋ค์ ์ค์ ์คํํ ์ค๋น๋ฅผ ํ๋ค.
}
// 8. orderCoffee ๋ฉ์๋๊ฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋๋ค.
public void orderCoffee() {
// 9. ๋ง๋ค์ด ๋ coffeeMachine ๊ฐ์ฒด์ brew() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
// ์ปดํจํฐ๋ CoffeeMachine์ brew() ๋ฉ์๋๋ก ์ด๋ํ๋ค -> 10๋ฒ
coffeeMachine.brew();
// 11. brew( ) ์คํ ์๋ฃ ํ ๋์์์ ๋ค์ ๋ฌธ์ฅ์ ์ถ๋ ฅํ๋ค.
System.out.println("์ฃผ๋ฌธํ์ ์ปคํผ๊ฐ ๋์์ต๋๋ค!");
// ์ด์ orderCoffee()์ ๋ชจ๋ ์ผ์ด ๋๋ฌ์ผ๋ฏ๋ก ํธ์ถํ๋ Main ํด๋์ค์ 7๋ฒ ์ค๋ก ๋์๊ฐ๋๋ค.
}
}
public class CoffeeMachine {
// 5. CoffeeMachine ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๋ค.
// ๊ธฐ๋ณธ ์์ฑ์๋ก ์ธํด ์๋ต๋์๊ณ ์ปดํจํฐ ๋ด๋ถ์์ ์๋์ผ๋ก ๋ง๋ค๊ณ ์คํํ ๋ค 6๋ฒ์ผ๋ก ๊ฐ๋ค.
// 10. ์ปคํผ ๋จธ์ ์ด ์ค์ ๋ก ์๋ํ์ฌ ์์คํ๋ ์๋ฅผ ๋ด๋ฆฝ๋๋ค.
public void brew() {
System.out.println("โ ์์คํ๋ ์๋ฅผ ์ถ์ถํฉ๋๋ค.");
// ์คํ์ด ๋๋ฌ์ผ๋ ์์ ์ ๋ถ๋ ๋ 9๋ฒ ์ชฝ์ผ๋ก ๋์๊ฐ๋ค.
}
}
์ผ๋ฐ ์๋ฐ ํด๋์ค๋ ์ข ๋ณต์กํ๊ฒ ๋์ด์๋ค. (์ค๋๋ง์ ์ด๋ฐ ์ฝ๋ ์ค๋ช ์ ์ผ๋ ค๋๊น ๋จธ๋ฆฌ์ํใ -ใ ) ๊ฐ๋ฐ์๋ ํ์ํ ๋ ๋ง๋ค ๋ง๋ค์ด์ ์กฐ๋ฆฝํ๊ณ ๋ค ์ฐ๋ฉด ๋ฃ์ด๋๊ฑฐ๋ ๋ฒ๋ฆฌ๋ ๊ณผ์ ์ ์ง์ ์ ์ด์ผ ํ๋ค.
2. ์คํ๋ง Bean ํด๋์ค
- ์คํ๋ง ํต์ฌ ์ปจํ ์ด๋(IoC ์ปจํ ์ด๋)์ ์ํด ์์ฑ, ๊ด๋ฆฌ, ์๋ฉธ๋๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
- ํด๋์ค ์์ ํน์ ์ด๋ ธํ ์ด์ (์_ @Component)์ ๋ถ์ฌ๋๋ฉด ์คํ๋ง์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผค ๋ ๊ด๋ฆฌํด์ผํ ๊ฐ์ฒด๋ฅผ ์์์ฐจ๋ฆฌ๊ณ ์์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค ์ปจํ ์ด๋์ ๋ณด๊ดํ๋ค.
- ์์์ฝ๋_ ์นดํ ์ฌ์ฅ๋์ด ์คํ๋ง ์ปจํ ์ด๋์ ์ปคํผ ๋จธ์ ์ Bean ๋ฑ๋ก์ ํด๋๊ณ ํ์ํ ๋ ๊ฐ์ ธ๋ค ์จ์
// ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋ํ๋ฉด ์คํ๋ง ์ปจํ
์ด๋๊ฐ ๋จผ์ ์คํ๋๋ค.
// ์คํ๋ง์ @Component ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ค์ ์ฐพ์๋ธ๋ค.
// 1. ์คํ๋ง์ด @Component๋ฅผ ๋ณด๊ณ CoffeeMachine ๊ฐ์ฒด๋ฅผ ๋ฑ ํ๋ ์์ฑํ์ฌ ์ปจํ
์ด๋์ ๋ณด๊ดํ๋ค.
@Component
public class CoffeeMachine {
// 8. ์ปคํผ๋จธ์ ์ด ์์คํ๋ ์๋ฅผ ๋ด๋ฆฐ๋ค.
public void brew() {
System.out.println("โ ์คํ๋ง์ด ๊ด๋ฆฌํ๋ ๋จธ์ ์์ ์์คํ๋ ์๋ฅผ ์ถ์ถํฉ๋๋ค.");
// ์คํ์ด ๋๋ฌ์ผ๋ ์์ ์ ๋ถ๋ ๋ 7๋ฒ ์ชฝ์ผ๋ก ๋์๊ฐ๋ค.
}
}
// 2. ์คํ๋ง์ด Cafe ํด๋์ค๋ ํ์ธํ๋ @Component๋ฅผ ๋ณด๊ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ณด๊ดํ๋ค.
@Component
public class Cafe {
private final CoffeeMachine coffeeMachine;
// 3. ์คํ๋ง์ด Cafe ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๊ณ ์์ฑ์๋ฅผ ๋ณธ๋ค.
// ์ด๋ @Autowired๋ฅผ ๋ฐ๊ฒฌํ๋ค.
// ๊ทธ๊ฑธ๋ณด๊ณ Cafe๋ฅผ ๋ง๋ค๋ ค๋ฉด CoffeeMachine์ด ํ์ํ ๊ฑธ ๊นจ๋ซ๋๋ค.
@Autowired
public Cafe(CoffeeMachine coffeeMachine) {
// 4. ์คํ๋ง์ด ๋ฐฉ๊ธ ์ (1๋ฒ)์ ๋ง๋ค์ด ๋ CoffeeMachine ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๊ฝ๋๋ค.
// ์ด๊ฒ ์์กด์ฑ ์ฃผ์
(DI)์ด๋ค.
this.coffeeMachine = coffeeMachine;
// 5. Cafe ๊ฐ์ฒด๊น์ง ์๋ฒฝํ๊ฒ ์กฐ๋ฆฝ๋์ด ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋์๋ค.
}
// 6. ์๋์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ์ฌ orderCoffee() ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
// ์ด์ ๊ฐ๋ฐ์๋ new Cafe()๋ฅผ ํ์ง ์์๋ ๋๋ค.
// ์คํ๋ง์ด ์์ฑํด ๋ Cafe ๋น์ ๊บผ๋ด์ด ์ด๋ค.
public void orderCoffee() {
// 7. ์คํ๋ง์ด ๋ฏธ๋ฆฌ ๊ฝ์๋์๋(4๋ฒ) coffeeMachine์ brew() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
// ์ปดํจํฐ๋ CoffeeMachine์ brew() ๋ฉ์๋๋ก ์ด๋ํฉ๋๋ค. -> 8๋ฒ์ผ๋ก ์ด๋
coffeeMachine.brew();
// 9. brew()์์ ๋์์์ผ๋ฉด ๋ค์ ๋ฌธ์ฅ์ ์ถ๋ ฅํฉ๋๋ค.
System.out.println("์ฃผ๋ฌธํ์ ์ปคํผ๊ฐ ๋์์ต๋๋ค!");
}
}
์คํ๋ง์๊ฒ ๊ด๋ฆฌ๋ฅผ ๋งก๊ธฐ๋ฉด ์ฝ๋๊ฐ ๊น๋ํด์ง๊ณ ์ ์ฐํด์ง๋ค. ์ด๋ ๊ฒ ์ฝ๋๋ง ๋ด๋ ์ฐจ์ด๊ฐ ํ ๋๊ปด์ง๋ค.
3. ์๋ฐ ํด๋์ค์ ์คํ๋ง ๋น ํด๋์ค์ ์ฐจ์ด
| ๊ตฌ๋ถ | ์ผ๋ฐ ์๋ฐ ํด๋์ค (๊ฐ์ฒด) | ์คํ๋ง ๋น(Bean) |
| ์์ฑ ์ฃผ์ฒด | ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฝ๋ new๋ก ์์ฑํ๋ค | ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์์ฑํ๋ค |
| ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ | ๊ฐ๋ฐ์๊ฐ ์์ฑํ๊ณ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)๊ฐ ์๋ฉธ์ํจ๋ค | ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑ๋ถํฐ ์๋ฉธ๊น์ง ์ ๋ถ ๊ด๋ฆฌํ๋ค. |
| ๊ฐ์ฒด์ ๊ฐ์ | new๋ฅผ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ์๊ธด๋ค | ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ผ๋ก ๋จ ํ๋๋ง ์์ฑ๋์ด ๊ณต์ ๋๋ค. |
| ์์กด์ฑ ์ฃผ์ (DI) | ํ์ํ ๊ฐ์ฒด๊ฐ ์ด๋ค๋ฉด ์ง์ ์์ฑํด์ค์ ๋ฃ์ด์ผํ๋ค | ์คํ๋ง์ด ํ์ํ ๊ฐ์ฒด๋ฅผ ์์์ ์ฐพ์์ ๊ฝ์์ค๋ค (@Autowired) |
- ๊ด๋ฆฌ

์๋ฐ ๊ฐ์ฒด๋ ๊ฐ๋ฐ์๊ฐ, ์คํ๋ง ๋น์ ์ปจํ ์ด๋๊ฐ ์ง์ ๊ด๋ฆฌํ๋ค.
- ์๋ช ์ฃผ๊ธฐ

์๋ฐ์ ์๋ช ์ฃผ๊ธฐ๋ 3๋จ๊ณ๋ก ์ฒ๋ฆฌ๋๋ค. ๊ทธ๋ฌ๋ ์คํ๋ง์ด ํจ์ฌ ๋ณต์กํ ๋จ๊ณ์ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น๋ค.
- ์ค์ฝํ
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ด๋ค ๋ณ์๋ ํจ์, ๊ฐ์ฒด ๋ฑ์ด ์ ํจํ ๋ฒ์๋ฅผ ์๋ฏธํ๋ค.

์๋ฐ ๊ฐ์ฒด๋ ์ฃผ๋ก ๊ฐ๋ณ ์ธ์คํด์ค ์ค์ฌ์ด๋ ๋น์ ์ฑ๊ธํค์ด ๊ธฐ๋ณธ์ด๋ค.
- ์์กด์ฑ ์ฃผ์

์๋ฐ ๊ฐ์ฒด๋ ์๋์ผ๋ก ์ฐ๊ฒฐํ์ง๋ง ๋น์ DI๋ฅผ ํตํด ์๋ ์ฐ๊ฒฐ๋๋ค. -> ์์กด์ฑ ์ฃผ์ ์ผ๋ก ๊ฒฐํฉ๋๋ฅผ ํด์ ํ๋ค.
- ์ ๋ฆฌ
์คํ๋ง Bean์ ์คํ๋ง IoC ์ปจํ ์ด๋์ ์ํด ์ธ์คํด์คํ๋๊ณ ์กฐ๋ฆฝ๋๋ฉฐ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ฉด ์ผ๋ฐ์ ์ธ ์๋ฐ ๊ฐ์ฒด๋ ๊ฐ๋ฐ์๊ฐ new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋๋ง๋ค ์ง์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ๊ณ ์ ์ดํด์ผํ๋ค. ๊ทธ๋์ ๋ชจ๋ ์คํ๋ง Bean์ ์๋ฐ ๊ฐ์ฒด์ ํด๋นํ์ง๋ง, ๋ชจ๋ ์๋ฐ ๊ฐ์ฒด๊ฐ ์คํ๋ง Bean์ ์๋๋ค.
์คํ๋ง Bean์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก ์๋ํ๋ฉฐ ์ฃผ๋ก ์ ๋ ธํ ์ด์ ์ด๋ ์ค์ ํ์ผ์ ํตํด ์ปจํ ์ด๋์ ๋ฑ๋ก๋๋ค. ์ด๋ฐํ Beane๋ค์ ์ปจํ ์ด๋์ ์ํด ํ์ํ ์์กด์ฑ์ด ์ฃผ์ ๋๊ณ ์ ์ ํ ๊ตฌ์ฑ๋ ์ํ๋ก ์ ๊ณต๋๋ค.
์ผ๋ฐ ์๋ฐ ํด๋์ค๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํด ์๋ฉธ๋ ๋๊น์ง ๊ฐ๋ฐ์๊ฐ ๊ทธ ์ฌ์ฉ ๋ฒ์๋ฅผ ๊ด๋ฆฌํ๋ค. ์คํ๋ง Bean์ ์ปจํ ์ด๋๊ฐ ์์ฑ๋ถํฐ ์๋ฉธ๊น์ง์ ์ ๊ณผ์ ์ ๋ด๋นํ๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ์ปจํ ์ด๋ Bean์ ์์ฑ, ์์กด์ฑ ์ฃผ์ , ์ด๊ธฐํ, ์ฌ์ฉ ๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ธ ์๋ฉธ ๋จ๊ณ๋ฅผ ๋ด๋ถ ์ํฌํ๋ก์ฐ์ ๋ฐ๋ผ ์ฒด๊ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ดค์ ๋ ํจ์ฌ ์ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค!