[Java] Spring Dependncy Injection (DI, 의존성 주입)

Nowod_K·2023년 3월 15일
0

Spring DI 이해하기

목록 보기
1/2
post-custom-banner

Dependency Injection

Dependency injection (DI) is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.

https://docs.spring.io/spring-framework/

위 내용은 공식 홈페이지에서 설명하고 있는 DI(의존성 주입)의 정의다. 해당 내용은 번역하면 다음과 같다.

"객체가 자신의 종속성을 정의하는 프로세스이다. 즉 객체들은 생성자 인자, 팩토리 인자 등 팩토리 메서드를 통해 반환된 속성을 통해서만 작업할 수 있다."

이게 도대체 무슨 말인가 싶겠지만, 하나씩 이해해보자.

종속성

  • Java에서 종속성이란 클래스간의 의존관계를 뜻한다.
    아래 코드를 보면 A 클래스의 함수를 실행하기 위해서는 B클래스를 필요로 한다.

  • 만약에 B 클래스에 변화가 생기면 이는 A클래스에도 영향을 미치게 되며, 이것이 바로 종속성이다.

class A {
	private B b;
    
    public A() {
    	this.b = new B();
    }
    
    public funcA() {
    	this.b.funcB();
    }
}

팩토리 메소드

자세한 내용을 원하신다면 여기로 (설명이 정말 잘 되어있습니다.)
https://refactoring.guru/ko/design-patterns/factory-method

팩토리 메소드는 객체를 구현하는 일종의 디자인 패턴이다.

  • 예를 들어 커피를 만드는 A 공장과 B 공장이 있다고하자.
  • A 공장에는 커피 원액 추출, 커피 만들기, 커피 담기 등의 공정이 있다. (커피에 최적화 되어있다.)
  • 어느날 공장 규모를 키우기 위해 A공장을 이용해 오렌지 쥬스를 만들기로 했다.
  • 그런데 A 공장은 커피만 생각하고 있었기에, 오렌지 쥬스를 위한 새로운 시설을 다 만들어야 한다.
  • B 공장은 이런 상황을 대비해 재료만 달라지면 다른 음료가 나오도록 공장을 설계했다.
  • B 공장은 원액 추출, 음료 만들기, 음료 담기의 틀만 만들어놓고 재료만 넣으면 그 재료에 해당되는 음료가 나온다.

A공장의 경우 쥬스를 만들기 위해 처음부터 다시 모든 공정을 만들어야 하지만, B공장은 재료에 대한 처리만 해주면 바로 쥬스를 만들 수 있다.

B공장의 경우가 바로 팩토리 패턴을 사용하였기에, 변화에 열려있고 확장이 가능하다.

해석

"객체가 자신의 종속성을 정의하는 프로세스이다. 즉 객체들은 생성자 인자, 팩토리 인자 등 팩토리 메서드를 통해 반환된 속성을 통해서만 작업할 수 있다."

위 정의를 해석해보면

  • 여러가지 객체를 가진 하나의 객체를 생성할 때,
  • 팩토리 패턴(변화에 열려있고, 확장이 가능한)을 사용해서 만들어진 객체들을 통해서만 작업하도록 한다.
  • 그렇게 만들어진 객체는 하위 객체들의 변화에도 크게 수정을 할 필요가 없고 안정적이다.
  • 팩토리 패턴으로 만들어진 객체는 외부에서 의존성이 주입되기에 이를 제어의역전(IOC)라고 한다.

이제 조금 이해가 가는 것 같다. 그런데 그렇다면 우리는 이 의존성을 주입하기 위해서 복잡한 팩토리 패턴의 코드를 일일히 개발해야 하는 것일까?

우리의 복잡한 이 마음을 바로 스프링(Spring)을 사용하여 평온을 만들 수 있다.

Spring 의존성 주입 알아보기

profile
개발을 좋아하는 마음과 다양한 경험을 토대로 좋은 개발자가 되고자 노력합니다.
post-custom-banner

0개의 댓글