-
스프링 DI, IOC란?백엔드/스프링 2021. 3. 2. 20:29
스프링에서 꼭 알고 넘어가야하는 개념들이 있다.
그 중 가장 기본이 되는 것이 바로 다음과 같은 두 요소다.
의존성 주입: DI (Dependency Injection)
제어반전: IOC (Inversion of Control)
우선 아래와 같은 예시를 보자.
DI, IOC의 필요성
예를 들어 위와 같은 파일을 가진 스프링 프로젝트가 있다고 가정해보자.
해당 프로젝트는 어떤 객체를 만드냐에 따라 자기 소개를 다르게 하는 기능을 한다.
위 코드는 메인 클래스 실행 코드다.
예를 들어 위와 같이 Police 객체를 만들고 메인 클래스를 실행하면 오른쪽과 같은 메시지가 뜬다.
만약 객체를 Student로 바꿔서 만들고 메인 클래스를 실행하면 오른쪽과 같은 메시지가 뜬다.
일반적으로 볼 수 있는 코드고 사용법도 간단하다.
하지만 이건 좋은 코드가 아니다. 바로 클래스간 결합력이 굉장히 강하기 때문이다.
즉 Introduce는 Human 패키지 내에 있는 Police, Student 클래스에 굉장히 의존하고 있다.
이럴 경우 값이 바뀔 때마다 개발자가 수정해야하고 유지보수도 굉장히 힘들어진다.
그리하여 등장한 개념이 바로 IOC(Inversion of Control)이다.
IOC에선 프로그램 제어 흐름이 반대로 진행된다.
기존에는 위와 같이 개발자가 직접 코드를 만들었다.
그리고 코드가 외부의 라이브러리, 객체 등을 불러오면서 코드를 실행했다.
하지만 IOC는 외부의 대상이 그것을 대신한다.
그리고 그 여기서 외부 대상은 우리가 배우고 있는 프레임워크의 한 종류인 스프링이 맡는다.
사실 파고들면 이런저런 이야기가 많다.
간단히 말하면 프레임워크가 중심이 되어 코드를 실행하는 것이다.
당연히 객체 생성, 관리 등도 프레임워크가 맡아서 한다.
이를 통해 각 클래스별 의존도를 낮추는 효과를 볼 수 있다.
그리고 이러한 IOC를 수행하는 수단 중 하나가 DI다.
스프링의 DI는 간단히 말하면 다음과 같다.
필요한 객체를 외부에서 생성해서 주입하는 것.
위 코드를 보면 매번 자기 소개를 바꿀 때마다 내부에서 객체를 생성한 것을 볼 수 있다.
하지만 DI를 통하면 이럴 필요가 없다.
New 생성자 없이도 외부에서 객체를 만들어 생성해주기 때문에 인터페이스와 같이
활용하면 코드 변경 없이도 결과값을 다르게 가져갈 수 있기 때문이다.
참고로 DI를 통해 외부에서 전달되는 객체는 빈(Bean)이란 이름으로 IOC 컨테이너에 저장된다.
그리고 필요에 따라 Bean 파일을 가져다가 변수에 주입해주는 것이다.
DI 실행해보기
우선 DI 방법은 여러가지가 있는데 우선 여기서는 그런거 신경 안쓴다.
그냥 xml 파일을 통해 결과값만 바꿔주는 기능만 구현해볼 것이다.
우선 위와 같이 Police, Student 객체를 하나로 묶을 Human 인터페이스를 생성한다.
그리고 human 변수에 객체를 주입시켜줄 human.xml를 생성한다.
참고로 Human 인터페이스는 위와 같이 매우 간단한 코드로 이뤄져있다.
그리고나서 Police, Student 클래스는 Human 인터페이스를 구현하도록 한다.
그 다음 Introduce 클래스를 위와 같이 수정해준다.
참고로 위 내용은 해당 위치에 있는 XML 파일을 참고하여 human이란 이름을 빈(Bean)을 찾는다.
그리고나서 해당 빈(Bean) 객체를 human 변수에 입력해준다는 뜻이다.
마지막으로 human.xml로 가서 위와 같이 빈을 하나 설정해준다.
위의 뜻은 class에 지정된 클래스에 파일에 맞는 객체를 id의 이름으로 생성한다는 뜻이다.
그리고 전에 쓴 것처럼 Introduce는 이러한 Bean 파일을 활용해서 객체를 변수에 넣는다.
그럼 결과는 위와 같이 나온다.
만약 결과를 바꾸고 싶다면 코드를 변경할 필요가 없다.
앞서 말한 것처럼 xml 설정만 바꾸면 된다.
human.xml로 돌아가 human id에 매칭되는 클래스 파일명만 바꿔주면 된다.
그러면 위와 같이 코드 변경 없이 바뀐 결과를 얻을 수 있다.
'백엔드 > 스프링' 카테고리의 다른 글
스프링 - 프로젝트 생성하기 (0) 2021.02.12 스프링(spring)이란? (0) 2021.02.02