본문 바로가기

BackEnd/Spring

의존성 주입방법 2가지

반응형

Hotel 클래스는 chineseChef 클래스가 필요한 상황이라고 가정하자.

 

즉 의존하고 있는 상황이다. 호텔에서는 중국요리사가 필요한것이다.

 

1
2
3
4
5
public interface Cook {
 
    public String cook();
    
}
cs

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.zerock.sample;
    import org.springframework.stereotype.Service;
    import lombok.Data;
 
@Data
@Service
public class ChineseChef implements Cook {
    
    @Override
    public String cook(){
        return "chinese cook";
    }
}
cs

그런데 갑자기 상황이 바뀌어 호텔에서 중국요리사가 아닌, 한국요리사가 필요하게 되었다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.zerock.sample;
    import org.springframework.stereotype.Service;
    import lombok.Data;
 
@Data
@Service
public class koreanChef implements Cook {
    
    @Override
    public String cook(){
        return "korean cook";
    }
}
cs

 

이런 변화된 상황에서 호텔클래스가 한국 요리사(의존)객체를 생성하는 방법은 2가지가 있다.

 

1. 의존 객체를 직접 생성하는 방법(new 사용)

 

하지만 이 방법은 단점이 있다. 아래와 같이 직접 생성하게되면 코드를 수정해주어야 한다.

 

만약 이렇게 한국 요리사 객체를 의존하는 클래스가 수십개라면 반복적인 수정이 필요하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
package org.zerock.sample;
    import org.springframework.stereotype.Component;
    import lombok.Data;
    
@Component 
@Data
public class SampleHotel {//직접 생성방식의 단점
    
    //private Cook chef = new ChineseChef();
    private Cook chef = new koreanChef();
    
}
cs

 

2. 의존 객체를 외부에서 주입받는 방법(setter 주입 방법)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zerock.sample;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import lombok.Data;
    import lombok.Setter;
    
@Component 
@Data
public class SampleHotel {
    
    @Setter(onMethod_ = @Autowired)//의존성 주입 방식 Setter 주입
    private Cook chef;
    
cs

 

3. 의존 객체를 외부에서 주입받는 방법(생성자 주입 방법)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.zerock.sample;
    import org.springframework.stereotype.Component;
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.ToString;
    
@Component 
@ToString
@Getter
@AllArgsConstructor//@AllArgsConstructor는 인스턴스 변수로 
//선언된 모든 것을 파라미터로 받는 생성자를 작성하게 된다.
public class SampleHotel {
    
    private Cook chef;
    
    /*public SampleHotel(Cook chef) {
        this.chef = chef;
    }*/
cs

 

위와 같이 스프링이 외부에서 객체를 주입해주는 방법을 사용하면 수십개가 아닌

 

딱 한번만 의존 객체의 코드를 수정해주면 된다. 주입하는 코드는 그대로 이다.

 

즉, 요구사항의 변경으로 수정해야 하는 곳이 많더라도, 변경 부분은 의존 객체로 제한된다.

 

단, 조건은 위와 같이 Cook라를 인터페이스를 선언 해두어야 한다.

 

만약 Cook가 인터페이스가 아닌 클래스라면 또 다시 주입 코드의 반복 수정이 필요하다.

 

즉, 주입해주는 객체는 Cook인터페이스를 구현한 클래스여야 한다.

 

그래야 chef변수에 주입이 가능하다.

 

 

반응형