Spring

Inversion of Control (μ œμ–΄μ˜ μ—­μ „)

vividswan 2022. 3. 9. 19:35

Inversion of Control

μ œμ–΄μ˜ μ—­μ „(Inversion of Control) -> IoC에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

μ œμ–΄

μ œμ–΄μ˜ 의미λ₯Ό μ•Œμ•„λ³΄μž.

ν•œ 클래슀의 λ©”μ„œλ“œμ—μ„œ λ‹€λ₯Έ κ΅¬ν˜„μ²΄μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“ λ‹€κ³  ν•΄λ³΄μž.

public class InstanceClass {
    public void run(){
        System.out.println("run!");
    }
}
public class Test {

    public static void setTest() {
        InstanceClass instanceClass = new InstanceClass();
        instanceClass.run();
    }

    public static void main(String[] args){
        setTest();
    }
}

TestλΌλŠ” ν΄λž˜μŠ€μ—μ„œ new μƒμ„±μžλ₯Ό μ΄μš©ν•΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.

이런 상황이 Test 클래슀의 setTest() λ©”μ„œλ“œκ°€ InstanceClassλ₯Ό μ œμ–΄ν•˜κ³  μžˆλŠ” 상황이닀.

public class Test {

    public static void setTest() {
        InstanceClass instanceClass = new InstanceClass();
        instanceClass.run();
    }

    public static void setTest1() {
        InstanceClass instanceClass = new InstanceClass();
        instanceClass.run();
    }

    public static void setTest2() {
        InstanceClass instanceClass = new InstanceClass();
        instanceClass.run();
    }

    public static void setTest3() {
        InstanceClass instanceClass = new InstanceClass();
        instanceClass.run();
    }

    public static void main(String[] args){
        setTest();
        setTest1();
        setTest2();
        setTest3();
    }
}

λ§Œμ•½μ— 이런 μ‹μœΌλ‘œ μ„œλ‘œ λ‹€λ₯Έ λ©”μ„œλ“œμ—μ„œ new μƒμ„±μžλ₯Ό μ΄μš©ν•΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“ λ‹€λ©΄ μ„œλ‘œ 같은 μΈμŠ€ν„΄μŠ€μΌκΉŒ?

닡은 μ„œλ‘œ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ΄λ‹€.

각 μŠ€νƒ μ˜μ—­μ—μ„œ λ©”μ„œλ“œκ°€ 호좜되고 κ·Έ μ•ˆμ—μ„œ μƒμ„±μžλ₯Ό μ΄μš©ν•΄ heap μ˜μ—­μ—μ„œ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€.

이 heap μ˜μ—­μ—μ„œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λŠ” μŠ€νƒ μ˜μ—­μ΄ μ†Œλ©Έν•  λ•Œ κ°€λΉ„μ§€ 컬렉터에 μ˜ν•΄ 같이 μ†Œλ©Έλ˜λ―€λ‘œ, setTest,1,2,3의 μΈμŠ€ν„΄μŠ€λŠ” μ„œλ‘œ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ΄λ‹€.

Spring IoC

DB에 μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” ν΄λž˜μŠ€λ“€, 컀λ„₯μ…˜ ν’€, μŠ€λ ˆλ“œ ν’€κ³Ό 같은 μžμ›μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” ν΄λž˜μŠ€λ“€μ΄ μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 번 λ§Œλ“€λ©΄, μžμ›μ˜ λ‚­λΉ„κ°€ 되고 μ˜ˆμƒν•  수 μ—†λŠ” 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

이외에도 μ„œλ²„μ—μ„œ μ‚¬μš©λ˜λŠ” Service, Repository 객체도 μ€‘λ³΅μœΌλ‘œ μ—¬λŸ¬ 번 λ§Œλ“œλŠ” 것보닀 μΈμŠ€ν„΄μŠ€λ₯Ό ν•œ 번만 μƒμ„±ν•΄μ„œ κ΄€λ¦¬ν•˜λŠ” 것이 μ•ˆμ •μ μΈ 방법이닀.

Springμ—μ„œλŠ” Spring IoC(Inversion of Control)의 방식을 톡해 μ΄λŸ¬ν•œ 관리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€.

즉, 클래슀λ₯Ό μƒμ„±ν•˜κ³ , μ˜μ‘΄μ„±μ„ μ£Όμž…ν•΄ μ£ΌλŠ” μ œμ–΄λ₯Ό Spring μͺ½μœΌλ‘œ μ—­μ „μ‹œμΌœ μŠ€ν”„λ§μ΄ κ΄€λ¦¬ν•˜λŠ” 것이닀.

μŠ€ν”„λ§μ΄ 인식할 수 μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜(@Component, @Repository, @Service λ“±λ“±..)을 μž…λ ₯ν•΄ μ£Όλ©΄ μŠ€ν”„λ§μ΄ IoC둜 관리해 μ€€λ‹€.

μ΄λ•Œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ‹±κΈ€ν„΄μœΌλ‘œ 관리해 μ£Όλ―€λ‘œ ν΄λž˜μŠ€κ°€ λ§Œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ“€μ΄ μ€‘λ³΅λ˜μ§€ μ•Šκ³ , ν•œ κ΅¬ν˜„μ²΄μ— ν•œμΈ μŠ€ν„°λ₯Ό λ§Œλ“€μ–΄μ€˜μ„œ κ΄€λ¦¬ν•˜κ²Œ λœλ‹€.

κ·ΈλŸ¬λ―€λ‘œ Spirng이 μΈμ‹ν•œ κ΅¬ν˜„μ²΄λ“€μ΄ ν•˜λ‚˜μ”© heap μ˜μ—­μ— λ§Œλ“€μ–΄μ Έμ„œ κ΄€λ¦¬λœλ‹€.

예제

import org.springframework.stereotype.Component;

@Component
public class InstanceClass {
    public void run(){
        System.out.println("run!");
    }
}
import org.springframework.beans.factory.annotation.Autowired;

public class Test {
    @Autowired
    private InstanceClass instanceClass;

    public void test(){
        instanceClass.run();
    }
}

IoCκ°€ 인식할 수 있게 @Component와 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ€€λ‹€.

μ΄λ•Œ 클래슀의 μœ„μΉ˜λŠ” μŠ€ν”„λ§ λΆ€νŠΈ 메인 클래슀의 ν•˜μœ„μ—¬μ•Ό μŠ€ν”„λ§ IoCκ°€ 인식할 수 μžˆλ‹€.

IoC에 μ œμ–΄κ°€ μ—­μ „λœ κ΅¬ν˜„μ²΄λŠ” μœ„μ™€ 같은 @Autowired와 같은 λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

λ˜ν•œ 이 μΈμŠ€ν„΄μŠ€λŠ” μ‹±κΈ€ν„΄μœΌλ‘œ κ΄€λ¦¬λ˜λŠ” 단 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ‹€.