κ°μ²΄μ κ΄λ¦¬λ₯Ό μ€νλ§ μ»¨ν μ΄λ(νΉμ IoC 컨ν μ΄λ)μ 맑겨 μ μ΄κΆμ΄ λμ΄κ° κ²μ μλ―Ένλ€.
=> μ€νλ§μ μ¬μ©νλ©΄ κ°μ²΄μ μ μ΄κΆμ 컨ν μ΄λλ‘ λκΈ°κΈ° λλ¬Έμ κ°λ°μλ λΉμ¦λμ€ λ‘μ§ μμ±λ§ μ§μ€νλ©΄ λλ€.
κ²°λ‘ μ μΌλ‘ μ μ΄μ μμ μ ν΅ν΄ μμ‘΄μ± μ£Όμ (DI), κ΄μ μ§ν₯ νλ‘κ·Έλλ°(AOP)λ±μ΄ κ°λ₯ν΄μ§λ€.
μμ‘΄μ± μ£Όμ (Dependency Injection) μ€μ¬μ DIμ μ€νμ λλ νλ μμν¬λ₯Ό μλ―Ένλ€.
Ex)
μ¬μ©νλ κ°μ²΄ : Aν΄λμ€, μ¬μ©λλ κ°μ²΄ : Bν΄λμ€
Aν΄λμ€μμ Bν΄λμ€λ₯Ό μ¬μ©νλ €λ©΄ new ν€μλλ₯Ό μ¬μ©νμ¬ Bν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ B ν΄λμ€μ λ©μλλ₯Ό μ¬μ©νκ² λλ€.
μ΄λ, Bν΄λμ€μμ ꡬννλ λ©μλλ₯Ό λ³κ²½νλ©΄ Aν΄λμ€μμλ ν΄λΉ λ©μλλ₯Ό λ³κ²½ν΄μΌνλ€.
μ΄λ° κ΄κ³λ₯Ό "Aν΄λμ€λ Bν΄λμ€μ μμ‘΄νλ€"λΌκ³ νλ€.
'μ¬μ©νλ κ°μ²΄' Aν΄λμ€μμ 'μ¬μ©λλ κ°μ²΄'μΈ Bν΄λμ€μ methodX λ©μλλ₯Ό νΈμΆνλ κ²½μ°λ₯Ό μλ‘ λ€μ΄λ³΄κ² λ€!
//ν΄λμ€ μμ‘΄μμ μΈμ€ν΄μ€ μμ±κ³Ό λ©μλ νΈμΆ
//νμ¬μ½λμμλ Aν΄λμ€μμ new ν€μλλ₯Ό μ¬μ©νμ¬ Bν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
//μΈμ€ν΄μ€μμ methodX() λ©μλλ₯Ό νΈμΆνλ€.
class A{
public λ°νν λ©μλ1(){
B b = new B();
b.methodX();
}
}
class B{
public methodX(){
...
}
}
ν΄λΉ μ½λλ₯Ό μ¬μ©νλ λμ€ μ€κ³κ° λ³κ²½λμ΄μ 'μ¬μ©λλ κ°μ²΄'λ₯Ό μλ‘κ² μμ λ Cν΄λμ€λ‘ λ³κ²½νκ³ methodY()λ©μλλ₯Ό νΈμΆνλλ‘ λ³κ²½νλ€.
//ν΄λμ€ μμ‘΄μμ μΈμ€ν΄μ€ μμ±κ³Ό λ©μλ νΈμΆ
//νμ¬μ½λμμλ Aν΄λμ€μμ new ν€μλλ₯Ό μ¬μ©νμ¬ Bν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
//μΈμ€ν΄μ€μμ methodX() λ©μλλ₯Ό νΈμΆνλ€.
class A{
public λ°νν λ©μλ1(){
B b = new B();
b.methodX();
}
}
class B{
public methodX(){
...
}
}
class C{
public methodY(){
...
}
}
μ΄λ¬ν μν©μμ μ΄λ»κ² Aν΄λμ€μ λ©μλ1() λ©μλλ₯Ό μμ νλμ§ μκ°νλ©΄ λ€μ μ½λμ κ°μ΄ λ³κ²½νλ €κ³ μκ°ν κ²μ΄λ€.
//ν΄λμ€ μμ‘΄μμ 'μ¬μ©νλ κ°μ²΄'ν΄λμ€μ μΈ κ΅°λ°λ₯Ό μμ
class A{
public λ°νν λ©μλ1(){
C c = new C(); //C->Bλ³κ²½, B() -> C() λ³κ²½
c.methodY(); //λ³κ²½
}
}
Ex)
IμΈν°νμ΄μ€κ° μκ³ μ΄κ²μ ꡬνν 'μ¬μ©λλ κ°μ²΄'μΈ B ν΄λμ€κ° μλ€. 'μ¬μ©νλ κ°μ²΄'μΈ Aν΄λμ€μμ Bν΄λμ€μ methodX λ©μλλ₯Ό νΈμΆνλ€.
1. Aν΄λμ€μμ new ν€μλλ₯Ό μ¬μ©νμ¬ Bν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
2. μΈμ€ν΄μ€μμ methodX λ©μλλ₯Ό νΈμΆνλ€.
μ¬κΈ°μ μ£Όμν΄μΌν μ μ Aν΄λμ€μμλ μΈν°νμ΄μ€λ‘ μΆμνλ Iλ₯Ό μ΄μ©νλ€λ κ²μ΄λ€.
//μΈν°νμ΄μ€μ μμ‘΄νλ μΈμ€ν΄μ€μ μμ± λ° λ©μλ νΈμΆ
class A{
public λ°νν λ©μλ1(){
I i = new B();
i.methodX();
}
}
interface I{
methodX();
}
class B implements I{
methodX(){
...
}
}
μ΄λ²μλ μ€κ³κ° λ³κ²½λμ΄μ 'μ¬μ©λλ κ°μ²΄'ν΄λμ€λ₯Ό λ³κ²½νκ² λλ€κ³ κ°μ νκ² λλ©΄ 'μ¬μ©λλ κ°μ²΄' Cν΄λμ€(IμΈν°νμ΄μ€λ₯Ό ꡬν)λ₯Ό νΈμΆν΄ methodXλ©μλλ₯Ό νΈμΆνλλ‘ λ³κ²½νλ€.
//μΈν°νμ΄μ€μ μμ‘΄νλ 'μ¬μ©λλ κ°μ²΄'ν΄λμ€μ λ³κ²½
class A{
public λ°νν λ©μλ1(){
I i = new B();
i.methodX();
}
}
interface I{
methodX();
}
class B implements I{
methodX(){
...
}
}
class C implements I{
methodX(){
...
}
}
Aν΄λμ€μ λ©μλ1λ₯Ό μ΄λ»κ² μμ ν κ²μΈκ°? λ€μ μ½λμ κ°μ΄ λ³κ²½ν κ²μ΄λ€.
//μΈν°νμ΄μ€μ μμ‘΄νλ 'μ¬μ©νλ κ°μ²΄' ν΄λμ€μ ν κ³³μ μμ
class A{
public λ°νν λ©μλ1(){
I i = new C(); //B() - > C()λ‘ λ³κ²½
i.methodX();
}
}
interface I{
methodX();
}
class B implements I{
methodX(){
...
}
}
class C implements I{
methodX(){
...
}
}
ν΄λμ€μ μμ‘΄κ³Ό λ¬λ¦¬ μΈν°νμ΄μ€μ μμ‘΄μ νκ³³λ§ μμ νλ€.
μ΄μ²λΌ μΈν°νμ΄μ€λ₯Ό ꡬνν 'μ¬μ©λλ κ°μ²΄'ν΄λμ€λ₯Ό λ³κ²½νλ κ²½μ° λ€μκ³Ό κ°μ μ΄μ μ΄ μλ€.
1. μΈν°νμ΄μ€λ μ°Έμ‘°λ₯Ό λ°λ μ νμΌλ‘ μ¬μ©ν μ μμΌλ―λ‘ λ³μμ μ΄λ¦μ λ³κ²½νμ§ μμλ λλ€.
2. μΈν°νμ΄μ€κ° μ μΈλ λ©μλλ₯Ό μ΄μ©νλ©΄ ν΄λμ€κ° λ°λμ΄λ λ©μλλͺ
μ λ³κ²½νμ§ μμλ λλ€.
μμ‘΄μ± μ£Όμ μ΄λ 'μμ‘΄νλ λΆλΆμ μΈλΆμμ μ£Όμ νλ κ²'μ΄λ€.
'μμ‘΄νλ λΆλΆμ μΈλΆμμ μ£Όμ νλ κ²'μ΄λΌλ λ¬Έμ₯μ 보면
κΈ°μ‘΄μλ μΈμ€ν΄μ€λ₯Ό μμ±νλλ° new ν€μλλ₯Ό μ¬μ©νμ§λ§ μΈμ€ν΄μ€ μμ±κ³Ό κ°μ μμ μ νλ μμν¬μ 맑길 μ μκ³ κ·Έ μν μ ν μ μλλ‘ κΈ°λ₯μ μννλ κ² -> 'DI 컨ν μ΄λ'
DI컨ν°μ΄λμ μΈμ€ν΄μ€ μμ±μ λ§‘κΈ°κ³ λ€μμ κ·μΉμ μ§ν€λ κ²μΌλ‘ 'μ¬μ©νλ κ°μ²΄' ν΄λμ€λ₯Ό μ ν μμ ν μ μκ²λ λ§λ€ μ μλ€.
μ΄λ Έν μ΄μ | κ°μ |
---|---|
@Controller | μΈμ€ν΄μ€ μμ± μ§μ. μ€νλ§ MVCλ₯Ό μ΄μ©ν λ 컨νΈλ‘€λ¬μ λΆμ¬ |
@Service | μΈμ€ν΄μ€ μμ± μ§μ. νΈλμμ © κ²½κ³κ° λλ λλ©μΈ(μλΉμ€) κΈ°λ₯μ λΆμ¬ |
@Repository | μΈμ€ν΄μ€ μμ± μ§μ. λ°μ΄ν°λ² μ΄μ€ μ‘μΈμ€(리ν¬μ§ν 리) κΈ°λ₯μ λΆμ¬ λΆμ¬ |
@Component | μΈμ€ν΄μ€ μμ± μ§μ. μ μ©λ μ΄μΈμ ν΄λμ€μ λΆμ¬ |