의존성 주입
: 객체를 직접 생성(new)하는게(=new 클래스 에 의존한다) 아니라 외부에서 생성한 후 주입(setter(), 생성자)을 시켜주는 방식
외부에서 생성된 객체를 setter(), 생성자를 통해 A라는 객체에 주입(외부에서 주입)
주입 방법
1. 생성자 주입 방식
생성자가 하나일 경우 별도의 어노테이션이 필요하지 않다
* 권장하는 방법으로 NullPointerException을 방지한다
> 객체 생성 시점에 무조건 주입해야 하므로 *BeanFactory에 들어있는 지 검사하여 Null이 발생시 Service,Bean 생성이 실패하여
스프링 동작이 실패하게 된다.
* 빈을 생성하고 의존관계를 설정하는 기능을 담당하는 가장 기본적인 IOC 컨에티너이자 클래스/ ApplicationContext는 BeanFactory를 구현하는 확장된 버전
ApplicationContext는 별도의 정보를 참고해서 빈의 생성, 관계, 설정등의 제어를 총괄
2. Filed 필드 주입 방식
@Autowired 어노테이션 사용
3. setter() 주입 방식
@Autowired 어노테이션을 사용하여 setter로 객체 주입
예제
인터페이스
public interface IEncode {
public String encode(String message);
}
A 클래스
public class Base64Encoder implements IEncode{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
B 클래스
public class Base64Encoder implements IEncode{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
* A와 B는 동일한 기능을 하는 클래스
DI 적용하는 부분 클래스
public class Encode {
// 외부에서 iencode에 주입하였기 때문에 의존성 주입이라 불림
// 객체를 가지고 있음
private IEncode iencode;
// public Encode(){
// // DI적용 후에는 코드를 건들이지 않고 재사용
// // this.iecode = new Base64Encoder();
// //this.iencode = new UrlEncoder();
// }
// DI 적용
// 생성자에서 외부에서 주입할 객체를 추상화하여 받는다
public Encode(IEncode iencode){
this.iencode = iencode;
}
public String encode(String message){
return iencode.encode(message);
}
}
메인출력(굳이 안봐도됨)
public class Main {
public static void main(String args[]){
// 인코딩할 url
String url = "www.naver.com/books/it?page=10&size=20";
/*
* DI (Dependency Injection)
* : 의존성 주입
* 외부로부터 객체를 주입하여 생성
* 1. 다른객체의 의존성으로부터 격리되어 영향 최소하하여 코드 테스트 용이
*/
// 객체 생성 방법
// 1. new를 사용하여 객체생성
// Base64
// Encode클래스 생성
Base64Encoder enc = new Base64Encoder();
String result = enc.encode(url);
System.out.println(result);
// url
// UrlEncode클래스 생성
UrlEncoder urlEnc = new UrlEncoder();
String urlresult = urlEnc.encode(url);
System.out.println(urlresult);
// 2. 인터페이스를 사용하여 객체생성
System.out.println("\n추상화 적용(확장) : ");
// IEncode 인터페이스 생성하여 객체 생성
IEncode enc1 = new Base64Encoder();
String result1 = enc1.encode(url);
System.out.println(result1);
IEncode urlEnc1 = new UrlEncoder();
String urlresult1 = urlEnc1.encode(url);
System.out.println(urlresult1);
// 3. DI를 적용하여 객체 생성
System.out.println("\nDI 적용 : ");
//Encode enc2 =new Encode(new Base64Encoder());
Encode enc2 =new Encode(new UrlEncoder());
String result2 = enc2.encode(url);
System.out.println(result2);
}
}
IOC로 연결
'Spring > 1-1. DI,IOC,Bean' 카테고리의 다른 글
IoC(Inversion of Control) 역제어 (0) | 2022.09.09 |
---|