DI란?
Dependency Injection의 약어로 말하면 「의존성의 주입」입니다.
Wikipedia에서 조사해 보면 「객체의 주입」이라고 쓰여졌습니다.
클래스 밖으로부터 의존성(객체)을 주입하는 것으로, 클래스간의 의존관계를 해결하는 목적을 가지고 있다고 합니다.
DI 컨테이너란?
DI를 실현하기 위한 프레임워크.
DI 컨테이너를 통해 인스턴스를 생성하고 관리합니다.
※ Spring에서는 DI 컨테이너가 관리하는 인스턴스를 「컴포넌트」라고 표현합니다.
@Configuration
Configuration 클래스임을 나타냅니다.
@Component
DI 컨테이너에 관리시키는 Bean으로서 클래스를 등록한다.
@ComponentScan
@Component 가 부여된 클래스를 스캔하여 Bean으로 DI에 등록합니다. 스캔 대상은 패키지로 지정될 수 있다. 방금 전의 AppConfig 클래스에 대해서, 설정을 실시하면 이하와 같이 된다.
컴포넌트 스캔
컴포넌트 스캔은 클래스 로더를 스캔하여 특정 클래스를 DI 컨테이너에 자동으로 등록합니다.
이번에는 컴포넌트 스캔의 대상으로 자주 사용하는 @Controller, @Service, @Component, @Repository에 대해 기재.
주석설명
@Controller | MVC 패턴의 C 역할을 담당하는 컴포넌트로, 이 어노테이션을 부여한 컴퍼넌트에서는 클라이언트로부터의 리퀘스트/응답에 관련되는 처리를 한다. · @RestController와의 차이 대략적으로 View로 전환할지 여부의 차이가 있습니다. |
@Service | 비즈니스 로직을 구현하는 구성 요소. |
@Repository | 데이터 지속성과 관련된 처리를 제공하는 구성 요소. ORM 등을 이용하여 데이터의 CRUD 처리를 구현한다. |
@Component | 상기 3 개에 해당하지 않는 컴퍼넌트. 유틸리티 클래스 등에 부여한다. thymeleaf 템플릿의 기능만으로는 붐비는 HTML로의 변환 로직을 사용하고 싶을 때 등에 편리. |
그 밖에도 디폴트로 이하의 어노테이션이 붙은 클래스가 대상이 된다.
- @Configuration
- @RestController
- @ControllerAdvice
- @ManagedBean
- @Named
1. Bean 정의
Spring에서는 DI 컨테이너에 등록하는 컴퍼넌트를 「Bean」, Bean의 구성을 정의하는 것을 「Bean 정의」라고 합니다.
Bean 정의 파일에 기술하는 것이 아니라, DI 컨테이너에 관리시키고 싶은 Bean 혹은 컴퍼넌트에 어노테이션을 부여해,
읽어들이는 것으로 DI 컨테이너에 등록하는 방법 입니다.
2. DI 묘사
DI 의 기술 방법의 종류는 이하의 3 개가 있습니다.
- 세터 인젝션
세터 인수에 대해 DI하는 방법.- 장점 : 테스트 중에 모의 객체로 대체하기 쉽습니다.
- 단점 : 의존하는 Bean이 많으면 setter가 많아진다
@Controller
public class SampleController {
// 이용하는 Bean의 필드를 정의한다.
private SampleService SampleService;
// Bean설정용의 setter를 @Authwired를 대여해 정의한다.
@Autowired
public void setSampleService(SampleService sampleService) {
this.sampleService = sampleService;
}
public void fuga() {
sampleService.hoge();
}
}
- 생성자 주입
생성자의 인수에 대해 DI하는 방법.- 장점 : 필드에 final 한정자를 붙여 불변으로 할 수 있다.
- 단점 : 의존하는 Bean이 증가함에 따라 인수가 증가합니다.
@Controller
public class SampleController {
// 이용하는 Bean의 필드를 정의한다.
private final SampleService sampleService;
// @Autowired를 대여한 생성자를 준비한다.(인수는Bean오브젝트)
// 생성자가 1개인 경우 @Autowired은 생략가능
@Autowired
public SampleController(SampleService sampleService) {
this.sampleService = sampleService;
}
public void hoge() {
// Bean을 이용한다.
sampleService.foo();
}
}
- 필드 주입
클래스의 필드에 대해 DI하는 방법.- 메리트 : 코드량이 적어 가장 심플하게 쓸 수 있다.
- 단점: 필드를 final할 수 없음
@Controller
public class SampleController {
// 이용하는 Bean의 필드를@Autowired을 정의한다.
@Autowired
private SampleService sampleService;
public void hoge() {
// Bean을 이용한다.
sampleService.foo();
}
}
'개발 > JAVA' 카테고리의 다른 글
JDBC 기초 (PreparedStatement, Driver Manager, Connection) (0) | 2022.11.22 |
---|---|
Java - Lombok 기초 (0) | 2022.11.15 |
Java - Collection 핵심만 요약해보자 (List, ArrayList, Map) (0) | 2022.11.04 |
java - UserDetails 과 UserDetailsService 로그인 기능 기초지식 (0) | 2022.11.02 |
java - @GeneratedValue 기초지식 (0) | 2022.11.01 |
댓글