DI(Dependency Injection) 이란 의존 관계 주입 기능으로, 객체를 직접 호출(new 연산자)하는 것이 아닌 외부(스프링 컨테이)에서 생성한 후 주입 시키는 방식을 말한다.
외부에서 두 객체 간의 관계설정을 해주는 디자인 패턴으로 인터페이스를 사이에 두어 클래스 레벨에서는 의존 관계가 고정되지 않도록하고, 런타임 시 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 한다.
장점
모듈 간의 결합도를 낮춘다.
유연성을 높인다.
테스트 작성을 용이하게 한다.
방법 3가지
DI에는 필드 주입, setter 주입, 생성자 주입이 있으나 의존관계가 실행 중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
생성자 주입
@Controller
public class Controller{
private Service service;
@Autowired
public Controller(Service service){
this.service = service;
}
}
필드 주입
@Controller
public class Controller{
@Autowired
private Service service;
}
setter 주입
@Controller
public class Controller{
private Service service;
@Autowired
public setService(Service service){
this.service = service;
}
}
컴포넌트 스캔과 자동 의존관계 설정
@Component : 에노테이션이 있으면 스프링 빈으로 자동 등록된다.
@Controller : 커트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
@Component를 포함하는 다음 에노테이션도 스프링 빈으로 자동 등록된다.
- @Controller
- @Service
- @Repository
번외 ) 자바 코드로 직접 스프링 빈 등록하기
@Configuration ,@Bean으로 생성자 메서드 직접 return 해준다.
사용하는 경우 : 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
'개발 > Java_Spring' 카테고리의 다른 글
[spring] 모호한 매핑 Ambiguous mapping (0) | 2023.08.18 |
---|---|
[java] 클래스와 인스턴스의 차이, 인스턴스의 장점 (0) | 2023.08.17 |
[Junit5] 실행 순서가 보장되지 않는 test에서 공통 생성자 관리 (0) | 2023.08.16 |
AssertJ 테스트 API (0) | 2023.08.16 |
[Java] 인터페이스란? (0) | 2023.08.09 |
댓글