leehyeon-dv 님의 블로그

의존성 주입이란 무엇일까? 본문

백엔드/spring 이론

의존성 주입이란 무엇일까?

leehyeon-dv 2024. 11. 28. 21:00

🔎의존성 주입이란?

스프링 컨테이너에서 객체 Bean을 생성하고 생성한 객체를 지정한 객체에 주입하는 방식

  • 객체 자체가 코드상에서 객체 생성에 관여를 안하기 때문에 객체 사이의 의존도를 낮출 수 있다 
  • 스프링 컨테이너에서 객체의 생명주기를 관리해 객체의 의존관계를 관리한다

✏️의존성 주입

 

    🚗       →       🔋

 예를들어 , 장난감은 배터리가 있어야 움직일 수 있기에 배터리에 의존한다
 장난감에게 배터리를 넣어주는 것을 의존성 주입이라고 생각하자 
//배터리 일체형
class Toy {
    private Battery battery = new Battery();
     
//배터리 분리형
class Toy{
    private Battery battery;
     
     public Toy(Battery battery){
         this.battery = battery;
     }
  •  필드주입
    • 클래스에 선언된 필드에 생성된 객체를 주입해주는 방식
    • 필드 주입 = 어노테이션 사용
@Controller
public class PetController{
	@Autowired
    private PetService petService;
}
  • 수정자 주입
    • 클래스의 수정자를 통해 의존성 주입
@Controller
public class PetController{

    private PetService petService;

	@Autowired
    public void setPetService(PetService petService){
    	this.petService = petService;
    }
}
  • 생성자 주입
    • 생성자 주입은 클래스의 생성자를 통해 의존성을 주입해주는 방식
    • 인스턴스가 생성될때 1회 호출되는 것이 보장 
    • final키워드
@Controller
public class PetController{

    private final PetService petService;

	@Autowired
    public PetController(PetService petService){
    	this.petService = petService;
    }
}

 

🤷‍♀️어떤 주입 방식이 좋을까?

스프링에서는 생성자 주입방식을 권장한다

생성자 주입 방식을 권장하는 이유는 무엇일까?

 

1. 객체의 불변성

생성자 주입방식을 사용할 경우 객체가 생성되는 시점에 생성자를 호출해 최초 1회만 주입한다

→ 불변 객체를 보장함

 

객체를 포함한 클래스가 생성되는 시점에 포함된 객체들도 반드시 생성되기 때문에 객체가 비어있을 가능성 배제

 

2. 순환 참조 문제 방지 가능 

순환 참조 = A,B 두 객체가 각각 서로를 필드에 포함해 참조하고 있는 상태이다

서로가 서로를 참조해서 A,B 두 클래스가 맞물려서 서로의 객체를 계속 생성하는 무한반복문제에 빠지게 된다

 

필드주입, 수정자 주입은 실제 메소드가 호출되었을때 runtime 에러와 함께 수정자 문제가 불거진다 

runtime에 에러가 발생하면 미리 예측이 어렵기 때문에 서비스 진행중에 문제를 야기할 수 있다 

 

생성자 주입은 스프링 어플리케이션이 구동되는 순간 에러가 발생한다 (컴파일 타임에 발생)

컴파일 타임에 발생하는 경우 개발자가 쉽게 추적이 가능해 서비스 진행전에 예방할 수 있다

 

3.테스트 용이함

단위 테스트를 진행할때 순수 자바 코드로 테스트가 가능하다

필드 주입을 사용하는 경우 순수 자바 코드에서는 의존성 주입(DI)가 이루어지지 않기에 필드가 null상태가 되어 에러가 발생한다

 

 

결론

  • 의존성 주입은 스프링 컨테이너에 Bean을 먼저 생성하고 지정된 객체에 주입하는 방식이다
  • 의존성 주입을 이용해 객체의 의존성을 낮춰 유연하고 확장성 있는 코드 개발을 할 수 있다
  • 의존성 주입에는 필드주입, 수정자 주입, 생성자 주입 세가지 방식이있다
  • 생성자 주입이 권장되는 이유는 객체의 불변성 보장, 순환 참조 에러방지, 테스트 용이와 같은 이유때문이다 
728x90

'백엔드 > spring 이론' 카테고리의 다른 글

스프링 부트 3 코드&구조 이해하기  (0) 2024.12.21
스프링 부트 3 둘러보기  (1) 2024.12.20
스프링 부트 시작하기  (0) 2024.12.20
백엔드 개발자가 알아두면 좋은 지식  (1) 2024.12.19
테스트 코드  (4) 2024.11.28