프로그래밍 언어/JAVA, SPRING

DI(의존성 주입) 란?

doomole 2023. 8. 16. 10:09
728x90

방장은 회사 프로젝트에서 @Autowired를 통해 객체를 주입하여 사용했었다.

이직을 하면서 다양한 프로젝트를 통해 생성자, Setter를 통한 의존성 주입을 경험하게 되었고, 그에 따라 DI에 대해 정리하게 되었다.

 


DI(의존성 주입) ?

Dependency Injection의 약자로 의존성 주입이라는 뜻

이해가 쉽게 코드로 설명하겠다.

public class Code1 {
	...
}

public class Computer {
	private Code1 code1 = new Code1();
    
    public getCode() {
    	this.code1.getCode();
    }
}

위 코드에서 Computer 객체가 Code1 객체를 생성하여 사용하고 있다.(Computer -> Code1에 의존한다.)

만약 getCode 메서드에서 Code1 객체 대신 다른 객체를 사용하고자 할 경우 수정이 필요하게 된다.(결합도 ↑)

 

public class Code1 {
	...
}
public class Code2 {
	...
}

public class Computer {
	private Code code;
    
    public Computer(Code code) {
    	this.code = code;
    }
    
    public getCode() {
    	this.code.getCode();
    }
}

위 코드와 같이 작성할 경우 Computer 객체를 생성할 때 필요한 객체를 주입하여 생성하게 되면 결합도가 낮아져 코드를 재사용할 수 있게 된다. 이를 의존성 주입이라고 한다.

 


DI(의존성 주입) 방법

의존성 주입방법은 3가지가 있다.

1. 생성자 주입

public class Code1 {
	...
}

public class Computer {
	private Code1 code1;
    
    // @Autowired(생성자가 여러개일 경우)
    public Computer(Code1 code1) {
    	this.code1 = code1;
    }
}

위에서 설명했던 방법이다. 만약 Computer 객체의 생성자가 여러개일 경우 @Autowired 어노테이션을 작성해야 한다.

Spring에서는 해당 방법을 권고하고 있다.

2. Setter 주입

public class Code1 {
	...
}

public class Computer {
	private Code1 code1 = new Code1();
    
    public setCode1(Code1 code1) {
    	this.code1 = code1;
    }
}

객체의 Setter를 사용해 의존관계를 주입하는 방법인데, 주입받는 객체가 변경될 가능성이 있는 경우에 사용된다.(사실 정확하게 이해하지 못했다.)

3. 필드 주입

public class Code1 {
	...
}

public class Computer {
	@Autowired
	private Code1 code1;
}

필드에 의존관계를 주입하는 방법이다. 코드가 간결해지는 장점이 있으며, 방장은 회사 프로젝트에서 주로 사용했다.

 

* 질문이나 문의사항, 피드백은 댓글로 남겨주세요.


참고

https://velog.io/@jeong-god/DI란-무엇인가