[Spring] 다양한 의존관계 주입(DI) 방법

이준영·2023년 8월 23일
0

🌱 Spring

목록 보기
5/18

참고: 김영한의 스프링 핵심원리 - 기본편


🌱 다양한 의존관계 주입 방법

스프링은 객체를 컴포넌트 스캔으로 여러가지 객체들을 빈으로 등록합니다. 그리고 해당 빈들에게 필요한 의존관계를 자동으로 주입해 주는 과정을 거치는데, 의존관계 주입을 명시하는 방법은 아래와 같이 여러가지 가 있습니다.

  1. 생성자 주입
  2. 수정자 주입(Setter)
  3. 필드 주입
  4. 일반 메소드 주입

위의 방법들을 하나하나 살펴보려 합니다.

🌱 생성자 주입

생성자를 호출할 때 의존관계를 주입받는 방법으로, 여러가지를 따져보았을 때 가장 무난하고 선호하는 방법입니다.

생성자 주입 특징

  • 생성자 호출 시점에 딱 한번만 의존관계를 설정하는것이 보장됩니다.
  • 의존관계가 필수적으로 필요하고, 한번 의존관계가 설정되고 나면 수정할 필요가 없을 경우에 사용합니다.
  • final 키워드를 통해 생성자 호출 시 누락되거나 하는 오류가 있으면 컴파일러가 알려줍니다.
💡 생성자가 하나만 존재한다면 @Autowired 어노테이션을 생략 가능 합니다!!
TMI 정보 : 이후 Lombok 라이브러리를 사용하면 @RequiredArgsConstructor 어노테이션 하나를 추가하여 생성자를 생략 가능합니다.

🌱 수정자 주입

Setter라 불리는 필드값을 변경하는 메소드를 통해 의존관계를 주입하는 방법입니다.

수정자 주입 특징

  • 의존관계를 변경할 필요가 있거나, 그럴 가능성이 있는 경우 사용합니다.
  • 자바빈 프로퍼티 규약의 수정자 메소드(setXXX)를 사용하는 방법입니다.
💡 자바빈 프로퍼티 규약이란?
간단히 설명하자면 필드 변수는 private 지시자로 선언해 값을 직접 수정, 조회하지 않고, 해당 값을 수정하길 원한다면 setXXX() 형식의 메소드로 수정하고, 조회하길 원한다면 getXXX() 형식의 메소드로 조회하라는 규약입니다.
❗️@Autowired의 경우 주입할 대상 빈이 없으면 에러를발생하게 됩니다. 빈이 없어도 동작하게 하는 세가지 방법이 있습니다.
1. @Autowired(required = false) : 주입하려는 빈이 없다면 해당 메소드를 실행조차 하지 않습니다.
2. @Nullable : 주입하려는 매개변수 앞에 @Nullable 어노테이션을 추가해준다면, null을 허용합니다.
3. Optional<> : Optional<> 로 해당객체를 감싸주는것도 의존관계 주입 대상 빈이 없더라도 메소드가 진행됩니다.

🌱 필드 주입

필드 주입이란 말 그대로 필드 변수에 @Autowired 어노테이션을 추가해 주입시키는 방법입니다. 사용하지 않는것이 좋고, 사용한다면 @SpringBootTest 아래에서 실행되는 테스트같이 실제 코드와 관계없는 테스트 코드에는 사용해도 무관합니다.

필드 주입 특징

  • 권장하지 않는 주입 방법 입니다. DI를 해주지 않는다면 private로 선언된 객체들에 접근할 방법이 없습니다.
  • 의존관계를 따로 주입할 방법이 없어 테스트가 어렵습니다. (Setter를 따로 추가 해야 가능)
  • 코드가 매우 간결해서 좋아보이긴합니다.
  • 아무튼 사용 안하는것이 좋습니다.
💡 순수한 자바 테스트에서는 필드 주입을 사용할 수 없습니다.
@SpringBootTest처럼 DI를 해주는 스프링 컨테이너가 있는 테스트에서 사용 가능합니다.

🌱 일반 메소드 주입

일반 메소드를 통해 주입 받을 수도 있습니다. 한번에 여러 필드를 주입받을 수 있지만, 잘 사용하지는 않습니다.


🌱 정리

  • 생성자 주입을 사용합시다. 대부분의 의존관계는 어플리케이션 종료 시점까지 변경될 일이 없고, 오히려 의존관계는 변해서는 안되는 경우가 대부분입니다.
  • private final 로 필드변수를 생성하면 컴파일러가 생성자 관련 오류들을 자동으로 잡아주어 편리합니다.
  • 수정자 주입을 사용하기 위해 Setter을 열어두면 이후 다른 개발자가 의존관계 수정을 해도 되는 객체인줄 알고 수정해서 난감한 상황이 발생할 수 있습니다.( 변경하면 안되는 메소드를 열어두는것은 좋은 설계방법이 아니라고 합니다.)
profile
작은 걸음이라도 꾸준히

0개의 댓글