2024.10.25.금.TIL DI, IoC

김기남·2024년 10월 25일
post-thumbnail

안녕하세요, 오늘은 DI, IoC 에 대해 정리해 보았습니다.

1. DI와 IoC의 기본 개념 소개

DI와 IoC는 객체 지향 프로그래밍에서 의존성을 관리하는 두 가지 중요한 개념입니다. DI는 객체 간의 의존성을 외부에서 주입하는 방법을 의미하고, IoC는 프로그램의 제어 흐름을 반전시키는 개념입니다. 이 두 개념은 서로 밀접하게 연결되어 있으며, 함께 사용될 때 더 큰 효과를 발휘합니다.

2. DI(Dependency Injection)란?

DI는 의존성 주입을 의미합니다. 객체가 다른 객체에 의존할 때, 그 의존성을 외부에서 주입하는 방식입니다. 예를 들어, 클래스 A가 클래스 B에 의존하고 있을 때, 클래스 A가 직접 클래스 B를 생성하는 것이 아니라, 외부에서 클래스 B의 인스턴스를 주입받는 방식입니다. 이렇게 하면 클래스 A는 클래스 B에 대한 의존성을 줄일 수 있습니다.

3. IoC(Inversion of Control)란?

IoC는 제어의 역전을 의미합니다. 전통적인 프로그래밍에서는 객체가 자신의 의존성을 직접 관리하지만, IoC에서는 객체의 생성과 생명주기를 외부에서 관리합니다. 즉, 객체가 자신을 생성하는 것이 아니라, IoC 컨테이너가 객체를 생성하고 관리합니다. 이로 인해 코드의 유연성과 재사용성이 높아집니다.

4. DI와 IoC의 차이점

DI와 IoC는 서로 다른 개념이지만, 함께 사용될 때 더 큰 효과를 발휘합니다. DI는 의존성을 주입하는 방법에 초점을 맞추고, IoC는 제어의 흐름을 반전시키는 데 중점을 둡니다. DI는 IoC의 한 구현 방법으로 볼 수 있습니다. 즉, DI는 IoC를 구현하기 위한 디자인 패턴 중 하나입니다.

5. DI의 장점과 단점

DI의 장점은 다음과 같습니다:

유연성 : 객체 간의 결합도가 낮아져서 코드의 유연성이 증가합니다.
테스트 용이성 : 의존성을 외부에서 주입받기 때문에 단위 테스트가 용이해집니다.
재사용성 : 객체를 재사용하기 쉬워집니다.

하지만 단점도 존재합니다

복잡성 : DI를 구현하기 위해 추가적인 코드가 필요할 수 있습니다.
학습 곡선 : DI와 IoC 개념을 이해하는 데 시간이 걸릴 수 있습니다.

6. IoC의 장점과 단점

IoC의 장점은 다음과 같습니다:

제어의 역전 : 객체의 생명주기를 외부에서 관리하므로 코드의 제어가 더 쉬워집니다.
모듈화 : 코드가 더 모듈화되어 유지보수가 용이해집니다.

단점으로는

성능 문제 : IoC 컨테이너를 사용하는 경우 성능이 저하될 수 있습니다.
디버깅 어려움 : 제어가 외부로 넘어가므로 디버깅이 어려울 수 있습니다.

7. Spring Framework에서의 DI와 IoC

Spring Framework는 DI와 IoC를 구현하기 위한 강력한 도구입니다. Spring에서는 IoC 컨테이너를 통해 객체의 생명주기를 관리하고, DI를 통해 의존성을 주입합니다. Spring의 DI는 XML 설정 파일이나 어노테이션을 통해 쉽게 설정할 수 있습니다.

8. DI와 IoC의 실제 예시

실제 예시로는, 웹 애플리케이션에서 데이터베이스 연결을 관리하는 DAO(Data Access Object) 패턴을 들 수 있습니다. DAO 객체는 데이터베이스와의 연결을 관리하며, 서비스 객체는 DAO 객체에 의존합니다. 이때, 서비스 객체는 DAO 객체를 직접 생성하는 것이 아니라, IoC 컨테이너를 통해 주입받습니다.

오늘의 코드카타

class Solution {

    public int solution(String number) {
        int answer = 0;
        int sum = 0;
        String[] number_list = number.split("");
        for (int i = 0; i < number_list.length; i++) {
            sum += Integer.parseInt(number_list[i]);
        }
        answer = sum % 9;
        return answer;
    }
}
public class Main {

    public static void main(String[] args) {

        Solution solution = new Solution();

        System.out.println(solution.solution("123"));
        System.out.println(solution.solution("78720646226947352489"));
    }
}

9로 나눈 나머지

profile
새로운 시작~!

0개의 댓글