1 minute read

1.DI(Dependency Injection)

DI(Dependency Injection)는 사용할 객체를 외부에 주입하는 것이다. Spring container에서 타입으로 빈을 검색해서 참조변수에 자동주입 한다.

Framework코드는 Drive메서드에 SuperEngine을 사용하고자 한다면 새로 객체를 생성하는 등 번거로운 작업을 해야한다. 하지만 DI를 하게 된다면, Spring Container에 있는 Bean을 주입받아 사용자 코드에 있는 SuperEngine을 사용할 수 있다. 이처럼 DI는 객체를 생성하는 코드를 작성 하는것과 같은 번거로운 일을 피할 수 있다.

Spring에서 DI를 적용하는 과정은 다음과 같다. 자동으로 주입할 클래스에 @Component을 입력한다. -> @Component가 입력된 클래스는 Spring Container에 Bean으로 등록된다. -> Bean을 주입할 곳을 찾기위해 Component Scan을 하고 @Autowired가 입력된 장소를 발견하면 Spring Container에 등록된 Bean을 주입한다.

1.2 자동주입 @Autowired

DI의 자동주입은 자동주입할 대상에 @Autowired를 붙여 사용한다. @Autowired는 인스턴스 변수(iv), setter, 참조형 매개변수를 가진 생성자, 메서드에 적용할 수 있다. 이 중에서도 생성자에 @Autowired를 붙이는 방법을 많이 사용한다.

  • 인스턴스 변수(iv)에 @Autowired의 사용

  • 참조형 매개변수를 가진 생성자에 @Autowired 사용(가장 추천)

  • 메서드에 @Autowired 사용

1.2.1 @Autowired 사용시 주의사항

1.검색된 Bean이 n개이면, n개의 Bean중에 참조변수와 이름이 일치하는 것을 주입한다.

2.주입 대상이 변수일 때, 검색된 빈이 1개 아니면 예외 발생

3.주입 대상이 배열일 때, 검색된 빈이 n개라도 예외 발생하지않음.

4.@Autowired(required=false)일 때, 주입할 빈을 못찾아도 예외가 발생하지 않는다.

1.3 @Resource

@Autowired는 Spring Container에서 Type으로 검색해서 자동주입 한다. 반면 @Resource는 Name으로 Bean을 검색해서 자동 주입한다. 만약 Spring Container에 Bean의 Name이 없으면 예외가 발생한다. @Resource는 Name의 Default값으로 해당 Bean의 Name으로 한다.

1.4 @Component

component-scan로 @Component가 클래스를 자동 검색해서 빈으로 등록한다. @Component는 @Controller, @Service, @Repository, @ContollerAdvice의 메타 애너테이션이다.


출처
스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌

Comments