본문 바로가기

IT/Spring

의존이란?/(DI란?)/의존의 개념/DI의 개념/의존의 기초/DI의 기초 - 사좋배 공유

1. 의존이란?

 

DI는 Depedency Injection의 약자로, 우리말로는 '의존 주입'이라고 주로 번역한다.

여기서 말하는 의존이란 객체 간의 의존을 의미하는데, 이해를 돕기 위해 회원 가입을 처리하는 기능을 구현한 코드를 보자.

 

회원 정보를 담은 Member 객체를 생성하고 MemberDao객체의 insert() 메서드를 이용해서 DB에 회원 데이터를 삽입한다.

 

MemberRegisterService 클래스는 new 연산자를 이용해서 MemberDao 인스턴스를 생성하고 있다.

new 연산자를 이용해서 생성한 인스턴스를 보통 객체라도 고 부른다.

 

위 코드에서 눈여겨볼 점은 MemberRegistserService 클래스가 DB 처리를 위해 MemberDao 클래스의 메서드를 사용한다는 점이다. 즉, 회원 데이터가 존재하는지를 확인하기 위해 MemberDao 객체의 selectByEmail() 메서드를 실행하고, 회원 데이터를 DB에 삽입하기 위해 insert() 메서드를 실행하고 있다.

 

★이렇게 한 클래스가 다른 클래스의 메서드를 실행할 때, 이를 '의존'한다고 표현한다.

 

(의존은 변경에 의해 영향을 받는 관계를 의미한다. 예를들어, MemberDao의 insert() 메서드의 이름을 insertMember()라고 변경하면, DI 메서드를 사용하는 MemberRegisterService 클래스의 소스 코드도 함께 변경된다. 이렇게 변경에 따른 영향이 전파되는 관계를 '의존'한다고 표현한다.)

 

의존하는 대상이 있으면, 그대상을 구하는 방법이 필요한데 가장 쉬운 방법은 의존 대상 객체를 직접 생성하는 것이다.

위 코드는 의존객체를 직접 생성하는 것이다.

MemberRegisterService 클래스에서 직접 의존하는 MemberDao 객체를 생성하기 때문에, 다음과 같이 MemberRegisterService 객체를 생성하는 순간에 MemberDao 객체도 함께 생성된다.

->유지 보수 관점에서 문제점을 유발할 수 있다.

 

 

해결법:

2. DI를 통한 의존 처리

 

DI는 의존하는 객체를 직접 생성하지 않고 의존 객체를 전달받는 방식을 사용한다.

예를 들어, 앞서 의존 객체를 직접 생성했던 MemberRegisterService 클래스에 DI 방식을 적용하면 아래와 같이 코드를 구현할 수 있다.

 

 

8~10행과 같이 생성자를 통해서 의존 객체를 전달받는다. 즉, 생성자를 통해 MemberRegisterService가 의존(Dependency)하고 있는 MemberDao 객체를 주입(injection) 받는 것이다. 의존 객체를 직접 구하지 않고 생성자를 통해서 전달받기 때문에, 이코드는 DI(의존 주입) 패턴을 따르고 있다.

 

결과:

MemberRegisterService 클래스를 사용하는 코드는 다음과 같이 MemberRegisterService 객체를 생성할 때 생성자에 MemberDao 객체를 전달해주어야 한다.