dependency injection

portal2moon·2020년 8월 2일
0

springboot

목록 보기
1/2

ioc 컨테이너

ioc컨테이너는 inversion of controll 의 약자로 객체의 사용, 생성, 등의 기능의 주체가 바뀐 컨테이너이다. 객체를 프로그래머가 직접 생성, 파괴 등의 관리를 했었다면 스프링에서는 객체를 빈으로 등록하여 ioc컨테이너에게 넘겨서 스프링이 객체를 제어하게 한다.

스프링 부트에서는 설정파일에 빈을 직접 등록해 줄 필요 없이 어노테이션만 붙이더라도 @EnableAutoConfiguration 에 의해 자동으로 빈이 등록된다.

EnableAutoConfiguration에 관한 내용이 담긴 링크

http://dveamer.github.io/backend/SpringBootAutoConfiguration.html

도메인 모델에서 사용한 RestaurantRepository객체가 있다.
이 RestaurantRepository는 datasource와 상호작용 하지는 않는 아직은 샘플에 불과한 객체라 할 수 있다. 컬렉션을 만들어서 그안에 데이터를 쌓아서 마치 db처럼 작동하는 것같은 객체일 뿐 이다.

레스토랑스 정보가 저장되는 객체인 RestaurantRepository객체에 @Component어노테이션을 선언함으로써 빈으로 등록한다.
@Component 어노테이션은 개발자가 직접 작성한 클래스를 빈으로 등록하고 싶을 때 사용하는 어노테이션이다.
비슷한 어노테이션으로 @Bean 이 있는데 @Bean 어노테이션은 프로그래머가 작성한 클래스가 아닌 외부 라이브러리에서 가져온 객체를 빈으로 만들고 싶을때 붙이는 어노테이션이다.
@Bean 과 @Component 에 관한 내용이 담긴 링크

https://galid1.tistory.com/494

객체를 Feild에 선언하고 @AutoWired 어노테이션을 붙여 객체를 주입받고있다.

객체를 주입받는 방법은 3가지가 있다.

  1. Feild 에 주입
@Autowired
private DemoService demoService;
  1. Setter 주입
private DemoService demoService;

@AutoWired
public void setDemoService(DemoService demoService){
	this.demoService = demoService;
}
  1. Contructor 주입
public DemoService demoService;

@AutoWired
public HelloController(DemoService demoService){
	this.demoService = demoService;
}

위 코드에서는 객체의 주입을 필드에 해주었는데 이는 사실 좋은 방식은 아니다.

수정자 주입 (setter) 를 이용한 주입은 어떠한 방식으로든 구현체를 구현해서 전달해주기만 하면 문제가 없다. 다만 문제는 구현체를 전달 해 주지 않아도 일단 객체가 생성된다는 점이다.

controller가 의존하는 객체를 주입받지 못하더라도 우선 생성이 되면 의존 기능을 호출하는 과정에서 NullPointException 이 발생한다.

public class A { 
    ...
    void doSomething(){ ... }
}

public class AController{
   private A a;
    
   public void setA(A a){
    	this.a = a;
   }
   
   public void contolA(){
        a.doSomething();
   }
}

위 코드에서 AController는 a라는 의존 객체가 없더라도 생성되는데에는 문제가 없다. 그러나 doSomething 을 호출 하는 순간 NullPointException 을 맞닥뜨리게 된다.
그러므로 생성과 함께 객체를 주입받기 위해 생성자에 @Autowired 하여 객체를 주입받는것이 더 올바른 방법이다.

생성자를 통한 객체주입은 그 객체를 final 선언할 수 있다는 장점도 있다.

profile
아예 안쓰는것보단.. 조금이라도 써 놓는 것이 도움이 될것같아 만든 벨로그입니다

0개의 댓글