DI(Dependency Injection)에 대한 설명과 해당 기술의 장점에 대해 설명해주세요.
=> DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.
=> 의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.
=> DI의 장점은 다음과 같다.
- 의존성이 줄어든다.
- 의존한다는 것은 그 의존대상의 변화에 취약하다는 것이다.
- DI로 구현하게 되었을 때, 주입받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어들게됨.
- 재사용성이 높은 코드가 된다.
- 의존하는 클래스를 구분하여 구현하면, 다른 클래스에서 재사용할 수가 있다.
- 테스트하기 좋은 코드가 된다.
- 의존 관계에 있는 클래스들을 분리해서 테스트할 수 있다.
- 가독성이 높아진다.
- 의존관계의 클래스들의 기능들을 별도로 분리하게 되어 자연스레 가독성이 높아진다.
스프링에서 DI 구현은 어떻게 하는가?
- 생성자 주입
- 객체의 생성자는 객체 생성시 최초 1회만 호출된다. 때문에 주입받은 객체가 불변 객체여야 하거나 반드시 해당 객체의 주입이 필요한 경우 사용한다.
- 순환참조를 방지한다. 순환참조시 필드주입과 수정자 주입은 프로그램 실행 중에 runtime 에러가 발생하고, 생성자 주입시에는 프로그램 실행 시점에 compile 에러가 발생한다.
- Setter 주입
- setter의 경우 객체가 변경될 필요성이 있다.
- Field 주입
- 필드 주입 시 final 키워드를 선언할 수 없어 객체가 변할 수 있다.
- 주입이 동시에 일어나 겹치는 경우 순환참조 에러가 난다.
DB에서 인덱스를 잘 사용하면 어떤 장점이 있을까요?
=> 인덱스의 장점으로는 테이블을 검색하는 속도와 성능이 향상된다.
모든 컬럼에 인덱스를 걸지 않는 이유
- 테이블보다 인덱스의 용량이 더 커질 수 있다.
- SELECT를 제외한 다른 DML의 속도가 많이 느려진다.
인덱스의 원리