[강의] 예제로 배우는 스프링 입문(IoC, DI)

IoC (제어의 역전)

일반적인 (의존성에 대한) 제어권: 내가 사용할 의존성은 내가 만든다. 
=> 보통은 new OwnerRepository(); 생성.

class OwnerController {
    private OwnerRepository repository = new OwnerRepository();
}

IoC: 내가 사용할 의존성을 누군가 알아서 주겠지 (내가 new로 생성하지 않는다.)

1. 내가 사용할 의존성의 타입(또는 인터페이스) 맞으면 어떤거든 상관없다.
2. 그래야 코드 테스트가 편하다.


class OwnerController {

    private OwnerRepository repo;

    public OwnerController(OwnerRepository repo) { // DI : 생성자 주입
        this.repo = repo;
    }

// repo를 사용합니다.

}



class OwnerControllerTest {

    @Test
    public void create() { 
        OwnerRepository repo = new OwnerRepository();
        OwnerController controller = new OwnerController(repo);
    }
}

IoC (Inversion of Control) 컨테이너

ApplicationContext (BeanFactory)

빈(bean)을 만들고 엮어주며 제공해준다.

빈(Bean)

스프링 IoC 컨테이너가 관리하는 객체

어떻게 등록하지?

1.Component Scanning

@Component

@Repository
@Service
@Controller
@Configuration

2.직접 일일히 XML이나 자바 설정 파일에 등록

어떻게 꺼내쓰지?

@Autowired 또는 @Inject

또는 ApplicationContext에서 getBean()으로 직접 꺼낸다.

정리

내가 이해한것을 정리해보자면,

일반적으로는 new연산자로 내가 사용할 의존성은 내가 만든다.

=> new OwnerRepository(); 생성.

하지만 스프링에서는

스프링 IoC 컨테이너에서 객체를 생성(new) 하고

의존성 주입해서 사용한다.

(DI - 의존성 주입 중 생성자 주입을 스프링에서 선호함.)

객체를 직접 생성 하는 것이 아니라 외부(IOC컨테이너)에서 생성된 객체를

주입시켜 setter,필드, 생성자를 통해 사용하는 방식이다.


IoC는 프로그램 제어권을 역전시키는 개념이고

DI는 해당 개념을 구현하기 위해 사용하는 디자인 패턴 중 하나로

이름 그대로 객체의 의존관계를 외부에서 주입시키는 패턴을 말한다.