Dependency Injection (DI)는
객체 지향 프로그래밍에서 소프트웨어 컴포넌트 간의 종속성을 관리하는 기술입니다. DI는 객체 간의 결합도를 낮추어, 유연하고 확장 가능한 코드를 작성할 수 있도록 돕습니다.
종속성 : 프로그램의 구조가 데이터의 구조에 영향을 받는 것
결합도 : 어떤 모듈이 다른 모듈에 의존하는 정도를 나타내는 것DI는 주로 두 가지 방식으로 구현됩니다.
- 필드 주입
- DI 컨테이너가 객체를 생성한 후, 객체 내부의 필드에 의존성을 주입하는 방식입니다. 즉, 객체가 생성된 이후에 DI 컨테이너가 필드에 값을 할당합니다. 필드 주입은 간결하게 코드를 작성할 수 있어서 코드의 가독성을 높일 수 있지만, 의존성이 외부에 노출되기 때문에 테스트에 어려움을 초래할 수 있습니다.
public class MyService { @Autowired private MyRepository repository; // ... }
- 생성자 주입
- DI 컨테이너가 객체를 생성할 때, 생성자를 통해 의존성을 주입하는 방식입니다. 즉, 객체 생성 시점에 필요한 의존성을 모두 주입받아서 객체를 생성합니다. 생성자 주입은 객체 생성 시점에 모든 의존성이 주입되기 때문에, 객체의 일관성을 보장할 수 있습니다. 또한, 의존성이 외부에 노출되지 않아서 테스트 용이성을 높일 수 있습니다.
public class MyService { private final MyRepository repository; public MyService(MyRepository repository) { this.repository = repository; } // ... }DI의 주요 장점은 다음과 같습니다.
결합도 감소
- DI는 객체 간의 결합도를 감소시켜, 코드를 더 유연하고 재사용 가능하게 만듭니다. 의존성이 직접적으로 코드에 적혀있지 않고, 외부에서 주입되기 때문에 의존성 변경에 대한 영향을 최소화할 수 있습니다.
테스트 용이성
- DI는 테스트 코드 작성을 용이하게 만듭니다. 의존성을 모의 객체(mock object)로 대체할 수 있기 때문입니다. 이를 통해 의존성을 단위 테스트(Unit Test)하기 용이하게 만들 수 있습니다.
코드 가독성 향상
- DI는 코드 가독성을 향상시킵니다. 코드에 필요한 의존성이 주입되는 것을 명시적으로 보여주기 때문입니다.
확장성 향상
- DI는 애플리케이션을 확장하기 쉽게 만듭니다. 새로운 의존성이 추가되거나 기존 의존성이 변경될 경우, DI 컨테이너에서 해당 의존성을 주입하면 되기 때문입니다.
DI 컨테이너 : 외부에서 객체를 생성하고 관리하면서 의존관계를 연결해주는것
따라서, DI는 객체 지향 프로그래밍에서 유용한 기술로, 코드의 유연성, 테스트 용이성, 코드 가독성 및 확장성을 향상시키는 데 도움을 줍니다.
검색 속도 향상
- 인덱스를 사용하면 테이블의 레코드를 일일이 검색하지 않고, 인덱스에 따라 검색 속도가 향상됩니다. 특히 대용량 테이블에서 검색 성능이 더욱 빠르게 향상됩니다.
쿼리 실행 속도 향상
- 쿼리를 실행할 때, DBMS는 인덱스를 사용하여 쿼리 실행 속도를 향상시킵니다. 인덱스를 사용하지 않으면 전체 테이블을 스캔하여 결과를 반환해야 하기 때문에 쿼리 실행 속도가 느려집니다.
데이터 무결성 보장
- 인덱스는 테이블의 유일성을 보장하기 때문에 데이터 무결성을 보장합니다. 예를 들어, Primary Key 또는 Unique Key를 사용하여 인덱스를 생성하면 중복된 데이터를 방지할 수 있습니다.
데이터 무결성 : 데이터의 Lifecycle 동안 모든 데이터가 얼마나 완전하고, 일관되며, 정확한지를 나타내는 정도
정렬 속도 향상
- ORDER BY 구문을 사용할 때 인덱스를 사용하면 정렬 속도가 향상됩니다. 인덱스를 사용하지 않으면 전체 테이블을 스캔하여 결과를 정렬해야 하기 때문에 정렬 속도가 느려집니다.
Join 성능 향상
- Join을 수행할 때 인덱스를 사용하면 Join 성능이 향상됩니다. 인덱스를 사용하지 않으면 대규모 테이블 간 Join을 수행할 때 성능 저하가 발생할 수 있습니다.
따라서, 인덱스를 잘 사용하면 DB 검색 및 쿼리 실행 속도가 향상되고, 데이터 무결성을 보장하며, 정렬 및 Join 성능이 향상됩니다. 하지만 인덱스를 사용하지 않는 쿼리나 테이블이 작은 경우, 인덱스를 사용하지 않는 것이 더 효율적일 수 있으므로 상황에 따라 적절하게 인덱스를 사용해야 합니다.