[Onboarding] : 종속성 주입

문승현·2022년 7월 5일
0

BeDev_1

목록 보기
4/7
post-thumbnail

지금까지 프로그래밍을 공부를 하면서, 혹은 프로젝트를 진행하면서
종속성 주입(Dependency Injection)이라는 것을 한 번도 해본적이 없었다.
이번 과제를 통해 처음으로 종속성 주입이 무엇이고 이를 실제 코드로 작성해보았다.
사실 코드 작성 자체는 어렵지 않았으나, 개념을 직관적으로 받아들이는 것이 어려웠다.

종속성 주입은 제어의 역전(Inversion of Control)을 실현하는 방법 중 하나이다.
제어의 역전이란 여러 가지 소프트웨어 설계 원칙 중 하나로 객체의 생명 주기를
(생성, 설정, 초기화, 소멸 등) 개발자가 아닌 프레임워크가 담당하는 것을 의미한다.

예를 들어 객체를 생성할 때, 클래스 내부에서 값을 지정하지 않고
프레임워크가 외부에서 값을 넣어주도록 하는 것은 제어의 역전이 이루어진 것이라 할 수 있다.
그리고 이때 외부에서 값을 넣어주는 것을 종속성 주입이라 한다.

종속성을 주입하는 방법은 다양하나 가장 일반적인 방법은 생성자를 통한 종속성 주입이다.
나 역시 과제를 수행하는 과정에서 아래와 같이 종속성 주입을 진행하였다.

    public class PostController : ControllerBase
    {
        // Dependency Injection by Constructor : IPostService 
        private readonly IPostService _postService;
        public PostController(IPostService postService)
        {
            _postService = postService;
        }   
    }

그런데 종속성(서비스)을 주입할 때는 해당 종속성의 생명 주기를 결정해주어야 한다.
생명 주기는 다음과 같이 Transient, Scoped, Singleton 등으로 구분할 수 있다.

Transient: Created each time they are requested.
Scoped: Created once per request.
Singleton: Created the first time they are requested. Each subsequent request uses the instance that was created the first time.
   

사실 이것만 봐서는 이해가 어려웠고 아래 세 번째 참고 자료가 큰 도움이 되었다.
아래 두 이미지는 해당 참고 자료에서 가져온 것인데,
첫 번째 이미지와 두 번째 이미지의 변경사항이 각각의 생명 주기의 특성을 잘 보여준다.

이미지에서 확인할 수 있듯이 Transient Guid는 각각의 요청 마다 다르다.
반면, Scoped Guids는 하나의 이미지 내에서는 같으나 서로 다른 이미지에서는 다르다.
마지막으로 Singleton Guids는 두 이미지 모두에서 그 값들이 동일하다.

그런데 제어의 역전과 종속성 주입을 하면 무엇이 좋은 것일까?
간단하게 말하자면 클래스들의 결합을 느슨하게 하여 테스트와 유지, 보수가 쉬워진다.
예를 들어 클래스들의 결합도가 높으면 하나의 클래스를 변경했을 때,
해당 클래스와 관련있는 클래스에 미치는 영향이 크다.
따라서 결합을 느슨하게 하여 불필요한 영향을 최소화하는 것이 중요하다.

사실 이번 과제는 대부분의 코드 작성을 혼자하였고, 코드의 양 자체도 많지 않아
종속성 주입을 어떤 맥락에서 수행해야하는지 큰 필요를 크게 느끼지 못했다.
앞으로 경험을 쌓아가면서 깨닫고 익숙해지는 순간이 오리라 생각한다.

참고 자료 1) - Architectural Principles
참고 자료 2 ) - Dependency injection in ASP.NET Core
참고 자료 3) - Getting Started with ASP.NET Core Dependency Injection
참고 자료 4) - Learn Inversion of Control (IoC) Principle

0개의 댓글