[Spring] Spring IoC, DI 정리

김윤환·2023년 3월 7일
0

Spring

목록 보기
1/1
post-thumbnail

백기선 선생님의 강의를 보고, 스프링의 특징에 대해 정리를 하고 싶었습니다.
강의와 공부한 내용을 바탕으로 먼저 IoC(Inversion of Control)와 DI(Dependency Injection)에 대해서 적어보려고 합니다.

🌱 IoC(Invesion of Control)

파파고로 Inversion of Control을 번역한 결과, 제어의 반전(역전)이라고 나와있습니다.

한 마디로 제어권이 나 자신이 아닌 다른 누군가로 뒤바꼈다는 것을 의미합니다.
이전 개발자들은 아래 코드와 같이 자신이 직접 new 연산자를 사용하여 객체를 생성하고 관리하였습니다.

class CellController {
	private CellRepository cellRepository = new CellRepository(); 
}

하지만 스프링 프레임워크를 사용하게 되면서 객체 제어를 본인이 아닌 외부에서 관리하게 됩니다. 다음 주석과 같이 자신이 객체를 생성하는 것이 아닌 다른 누군가가 주입시켜줍니다.

class CellController {
	private CellRepository cellRepository;
    
    public CellController(CellRepository cellRepository) {
    	this.cellRepository = cellRepository; // 누군가가 주겠지?
    }
}

위와 같이 객체의 생성부터 소멸까지 인스턴스의 생명주기관리를 외부(IoC컨테이너)에서 제어하는 방식을 제어의 역전(IoC)라고 합니다.
❗️ IoC 컨테이너 : 스프링 빈(Bean)이라는 객체를 관리하여 의존성을 주입하고 관리하는 공간
❗️ 빈(Bean) : 스프링 컨테이너가 관리하는 자바 객체
빈을 등록하는 방법은 다음 포스팅 때 다루도록 하겠습니다. 간략하게 정리하자면 @Component 어노테이션을 사용하여 컴포넌트 스캔하는 방법과 @Configuration과 @Bean을 사용하여 빈을 등록하는 방법이 있습니다.

🌱 DI(Dependency Injection)

A가 B에 의존하다 : 의존대상(B)가 변하면 그것이 A에 영향을 미친다.
' 토비의 스프링 3.1 Vol.1 스프링의 이해와 원리 - 이일민 '

위와 같이 의존관계는 B의 기능이 추가 및 변경되면 그 영향이 A에게 전달된다는 뜻입니다. 반대로 말하면 B는 A가 변경되도 영향을 받지 않는다는 뜻이겠죠? 아까 전 IoC에서 new 연산자로 객체를 생성했던 코드로 의존관계를 설명해보면 'CellController는 CellRepository를 의존한다.'라고 할 수 있습니다.

그렇다면 의존관계 주입(Dependency Injection)이란 무엇일까?
의존관계 주입이란 구체적인 의존 오브젝트와 그것을 사용할 주체, 보통 클라이언트라고 부르는 오브젝트를 런타임시에 연결해주는 작업을 말합니다.

class CellController {
	private CellRepository cellRepository;
    
    public CellController(CellRepository cellRepository) {
    	this.cellRepository = cellRepository; // 누군가가 주겠지?
    }
}

class CellControllerTest {
    @Test
    public void create() {
    	CellRepository repo1 = new CellRepository();
    	CellController cellController = new CellController(repo1);
    }
}

IoC 코드를 활용해서 의존관계 주입 소스를 작성해봤습니다. 주석처리 되어있는 '누군가가 주겠지?'라는 부분을 확인해보면 외부 create 메서드에서 선언한 repo1을 주입받고 있습니다. 이와 같이 의존관계를 외부에서 주입하는 것을 의존관계 주입(DI)라고 합니다.

의존관계 주입 장점

마지막으로 의존 관계를 분리하여 외부에서 주입하게 되면 어떤 장점이 있을까요?

  • 결합도가 줄어든다
    의존 오브젝트가 수정되더라도 클라이언트 변경이 필요없기 때문에 객체 간 결합도를 낮출 수 있습니다.
  • 코드의 유연성, 재사용성을 높여준다
    다양한 버전의 의존 오브젝트를 생성함으로써, 유연성과 재사용성을 높여줄 수 있습니다.
  • 테스트가 용이하다
    객체 간 테스트를 분리하여 진행할 수 있기 때문에 Unit Test 할 때 용이합니다.

참고문헌 및 강의

  • 스프링 프레임워크 입문 / 백기선
  • 토비의 스프링 3.1 (Vol. 1 스프링의 이해와 원리) / 이일민
profile
타인에게 보다 나은 삶을 제공하고 싶은 개발자 Stin입니다.

0개의 댓글