본문 바로가기

개발/Spring

[Spring Boot] Dependency Injection(DI) : '의존성 주입'이란?

인프런으로 Spring boot를 공부하다가, Test를 배우는 도중, 동일한 객체임에도 불구하고 본 파일에서의 객체와 테스트에서의 객체가 다를 경우에 대해 다루는 것을 배웠다. 이럴 때에는 디펜던시 인젝션을 통해 의존성 주입을 해준다고 한다. 공부를 하는 차원에서 간단히 메모해보겠다. 그저 나의 생각을 정리하는 부분이므로, 틀린 지식일 수 있다는 점을 감안하길 바란다.

간단히 얘기해서 어떤 상황이냐면,

class MemberServiceTest {

	MemberService memberService = new MemberService();
	MemoryMemberRepository memberRepository = new MemoryMemberRepository();

}

new로 해당 클래스 내에 객체 생성이 되면, 아무래도 다른 인스턴스기때문에 내용물이 달라질 수 있는 상황이다.

그래서 본 파일에 있는 객체와 테스트 파일에 있는 객체가 서로 다를 수 있는 가능성이 있고, 따라서 서로 다른  Repository가 Test 될 수 있는 상황이다. 

 

해결 방법은 다음과 같다.

public class MemberService {

    /*private final MemberRepository memberRepository = new MemoryMemberRepository();*/

    private final MemberRepository memberRepository;

    // memberRepository를 외부에서 넣어주도록 바꾼다
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }


    /**
     * 회원 가입
     */
    public Long join(Member member) { ...

기존의 주석처리 된 부분처럼 객체를 직접 new 해서 새로 생성해주는 것이 아니라, 살짝 우회하는 방식으로, 생성자를 통해 외부에서 객체를 생성할 수 있도록 처리해주는 것이다.

그리고 Test로 다시 이를 옮기는 방법은 다음과 같다.

class MemoryMemberRepositoryTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
        // dependency i
    }

@BeforeEach -> 각 테스트를 실행 하기 이전에 각각 새로 실행을 해준다. memberRepository를 MemberService에 넣어주어서 MemberService 생성자에서 실행! 이렇게 되면, 같은 MemoryMemberRepository가 사용된다.

 


■ Dependency Injection이란?

객체 자체가 아니라 Framework에 의해 객체의 의존성이 주입되는 설계 패턴

  • Framework에 의해 동적으로 주입되므로 여러 객체 간의 결합이 줄어든다.
  • Dependency Injection은 Spring Framework에서 지원하는 IoC의 형태

장점은 다음과 같다.

1. 재사용성을 높여준다.

2. 테스트에 용이하며

3. 코드도 단순화 시켜준다.

4. 종속적이던 코드의 수도 줄여준다.

5. 왜 사용하는지 파악하기 수월하며 코드를 읽기 쉬워진다.

6. 종속성이 감소한다. 종속성이 감소하면, 변화에 민감하지 않다.

7. 결합도(coupling)는 낮추면서, 유연성과 확장성은 향상시킬 수 잇다.

8. 객체간의 의존 관계를 설정할 수 있다.