IoC(Inversion of Control)

박찬미·2021년 3월 3일
0

Spring

목록 보기
3/6

IoC

제어권이 역전된 것
일반적인 (의존성에 대한) 제어권 - "내가 사용할 의존성은 내가 만든다."

class OwnerController{

    private OwnerRepository repository = new OwnerRepository();

} 

일반적으로 자기가 사용할 의존성을 스스로 만들어 사용한다.
여기서 제어권 역전은! "내가 아니라 다른 누군가가 알아서 해주겠지"

  • 내가 사용할 의존성의 타입(또는 인터페이스)만 맞으면 어떤 것이든 상관X
  • 코드 테스트 편의성 증가

class OwnerController{

    //repo 사용한다. 하지만 여기서 직접 만들지는 않는다. 
    private OwnerRepository repo;

    public OwnerController(OwnerRepository repo{

    	this.repo = repo;

    }

}

오너 컨트롤러 코드 밖에서 누군가가 의존성을 줄 수 있게끔 생성자를 통해 받아온다.
이건 오너 컨트롤러가 하는 것이 아니고, 이 의존성을 관리하는 누군가,,,오너 컨트롤러 밖에서 해주는 것 = 제어권이 역전됐다.

dependency injection은 일종의 IoC라 볼 수 있다. = 의존성을 관리하는 그 자체 제어권을 역전했기 때문


코드 통해 함 보자

  • sampleRepository class
public class SampleRepository {

    public void save() {

    }

}

먼저 레파지토리 만들어주고, save 메소드 추가


  • sampleController class
package org.springframework.samples.petclinic.sample;



public class SampleController {

	SampleRepository sampleRepository;



    public SampleController(SampleRepository sampleRepository) {

    	this.sampleRepository = sampleRepository;

    }



    public void doSomething(){

    	sampleRepository.save();

    }

}

controller에서 repository를 만들어 사용하고 있다.
보면, controller가 repository 인스턴스를 만들어 인수로 넣어주고 사용한다.


package org.springframework.samples.petclinic.sample;



public class SampleControllerTest {



    @Test
    public void testDoSomething(){

		@MockBean
    	SampleRepository sampleRepository = new SampleRepository();

    	SampleController sampleController = new SampleController(sampleRepository);



    }

}

controllerTest에서 repository를 mockBean이라는 어노테이션을 써서 사용
(MockBean - Mock 객체를 만들어 Bean(스프링이 관리하는 객체)으로 등록해주는 어노테이션)

repository 타입의 인스턴스를 테스트에서 자동으로 만들어준다. = controller 생성할 때 repository 빈을 가져와 자동 주입(스프링 IoC 컨테이너가)

controllerTest에서 controller를 쓰려면 repository를 만들어야만 한다.



스프링이 빈이라는 객체를 관리한다.
빈들의 의존성을 관리하고, 객체를 만들어 빈으로 등록해주고(객체들이 스프링 컨테이너 안에 있기 때문에 빈이라고 부른다.)

이렇게 의존성 관리, 필요한 의존성을 서로 주입해준다.
어떤 특정 생성자나 어노테이션을 보고 주입해줄 수 있다.

0개의 댓글