KKanging

[Spring] DI 방법 본문

백엔드/Spring framework

[Spring] DI 방법

천방지축 개발자 2024. 5. 7. 13:33

다양한 의존관계 주입 방법

  1. 생성자 주입
  2. 수정자 주입
  3. 필드 주입
  4. 일반 메서드 주입

 

생성자 주입

  • 생성자를 이용해 의존 관계를 주입 받는 방법
  • 특징
    • 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.
    • 불변, 필수 의존관계에 사용

수정자 주입( setter 주입)

  • setter 라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법
  • 특징
    • 선택, 변경 가능성이 있는 의존관계에 사용
    • 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.

필드 주입

  • 특징
    • 코드가 간결 하지만, 외부에서 변경이 불가능해서 테스트 하기 힘들다는 치명적인 단점이 있다.
    • DI 프레임워크가 없으면 아무것도 할 수 없다
    • 사용하지 않는걸 추천
      • 애플리케이션의 실제 코드와 관계 없는 테스트 코드
      • 스프링 설정을 목적으로 하는 Config 같은 곳에서만 특별한 용도로 사용된다.

일반 메서드 주입

  • 굳이 이렇게 사용하나 싶다

생성자 주입을 추천

  • 생성자 주입을 추천한다 이유는 다음과 같다

불변

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.
  • 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다.(불변해야 한다.)
  • 수정자 주입을 사용하면, setXxx 메서드를 public으로 열어두어야 한다.
  • 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계할 수 있다.

누락

  • 수정자를 통한 의존관계 주입은 컴파일 에러를 생산하지 않는다.
    • 기본 실행은 컴파일 에러를 나타낼 수는 있지만 단위 테스트 같은 테스트는 컴파일 에러를 발생하지 않고 실행되기 때문에 에러를 잡기 힘들다.

롬복을 활용한 깔끔한 코드

위 처럼 코드를 짜는 것을 추천한다 하지만 뭔가 계속 의존관계를 설정할때마다 이렇게 하는것도 귀찮다.

그래서 Spring은 다음과 같은 기능을 지원한다.

생성자가 하나만 있을 때는 @AutoWired를 쓰지 않아도 하나 있는 생성자에 AutoWired를 적용한다.

근데 생성자 만드는 것도 귀찮다.

이렇게 하면 final 키워드를 쓴 필드 변수에 대한 생성자를 만들어준다.

코드가 훨 깔끔해졌다.

보충

롬복

롬복은 어노테이션 기반으로 개발자에게 편의를 제공하는 어노테이션이 많이 존재

따로 공부 추천

롬복 주의점

롬복을 사용하다 보면 위 같은 어노테이션을 많이 활용할 수도 있다.

하지만 위 어노테이션은 대도록이면 도메인 같은 Data 클래스나 일반적인 클래스에는 사용하지 않는걸
권한다는 여론이 많다

이유는 다음과 같다.
@AllArgsConstructor
public class Test{
	private Integer t2;
	private String t1;
}

public class TestClass{

	public void Test(){
		Test test = new Test("1" ,1);
	}
}

위처럼 사용된다고 가정하자
근데 만약
@AllArgsConstructor
public class Test{
	private String t2;
	private Integer t1;
}
다음과 같이 변경되었다고 가정하자

그럼 
	public void Test(){
		Test test = new Test("1" ,1);
	}
	위코드는 오류가 날 것이다.
따라서 웬만해서는 사용하는 것을 주의하자