kenzi

스프링 5일차 (Autowired, interface, scope) 본문

Spring

스프링 5일차 (Autowired, interface, scope)

kenzi 2022. 4. 1. 18:14

오늘의 정리

1) Autowired란 정확히 무엇인가? 

한마디로 "의존관계 설정"이다 

xml에서 Component-scan을 할 때에 @Component가 붙은 객체(=Bean)에 의존성을 주입시켜준다 

일반적으로 xml에서 의존성 주입을 할 때에 <constructor~ />(=생성자 방식)나 <property~ />(=setter메서드 방식) 로 injection을 해준다 

하지만 Component로 빈 객체를 등록할 때에는 의존성 주입을 어떻게 해야할까?

정답은 @Autowired이다 

생성자나 setter메서드에 @Autowired를 걸어주면 자동으로 엮어준다 (=주입시켜준다)

 

 

 

 

2) 인터페이스?

@Configuration
public class Container2 {

@Bean
public Viewer viewer() {
		MonitorViewer viewer = new MonitorViewer();
		viewer.setDisplayMode(displayMode());
		return viewer;	
	}
    
//애초에 인터페이스 없이 이렇게 만들면 안되나요?
public MonitorViewer monitorViewer() {
		MonitorViewer viewer = new MonitorViewer();
		viewer.setDisplayMode(displayMode());
		return viewer;	
}



}

안됩니다 

왜요? 

MonitorViewer말고 ScreenViewer가 추가될수도 있는데 그때 또 만들어서 클래스마다 수정하는 거보단  

MonitorViewer가 Viewer인터페이스를 상속받아서 추상 메서드의 몸통을 구체적으로 만들고 실행하는 걸로 하고  그 객체를 리턴하는게 낫죠 

예를 들면 설명서의 기본 언어는 한국어인데 영어도 추가해야할 때 모든 설명을 영어로 일일이 바꿀려면 야근해야하잖아요....! 

 

그래서 인터페이스에는 추상 메서드만 적고 구현 클래스에서는 추상 메서드의 몸통을 구체적으로 적어야한다!

인터페이스에 있는 모든 메서드를 override(나 이거 조상의 메서드 오버라이딩하는거다!의 표시) 하지 않으면 에러난다 

//Viewer 인터페이스
public interface Viewer { 


//인터페이스 메서드는 기본이 public이다 public을 붙여도 되고 안 붙이면 public이 생략된거다 	
	 void draw();
	
	 void add(Camera camera);
	
}
//MonitorViewer
public class MonitorViewer implements Viewer { //인터페이스를 상속받고

	private DisplayMode displayMode;
	
	public void setDisplayMode(DisplayMode displayMode) {
	 this.displayMode = displayMode;
	}


//Viewer인터페이스에 있는 메서드의 몸통을 구체적으로 만들어줘야한다 
	@Override
	public void draw() {
		System.out.println(displayMode.getType() + " 모드로 카메라 이미지 출력됨");
		
		
	}

	@Override
	public void add(Camera camera) {
		// TODO Auto-generated method stub
		System.out.println("모니터에 " + camera + " 영상 추가");
		
	}
}

 

 

3. scope

@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) 

는 메서드를 실행할 때마다 새로운 빈 객체를 생성해주는 거고

 

@Scope("prototype")

은 getBean으로 빈을 불러올때만 새로운 빈 객체를 생성해주는거다 

 

 

4. xml로 <property name = "kenzi" ref = "~~">

하고 setKenzi(~~) 할때 

setter메서드의 파라미터(~~)는 1개밖에 넣지 못한다 명심! 

여러개 넣기? 불가능

 

//KenziHomeController.java
    private AlarmDevice alarmDevice;
	private Viewer viewer;
    
 	//Anno로 할 때는 이런 메서드가 가능하지만 
    public void prepare(AlarmDevice alarmDevice, Viewer viewer) {
		 this.alarmDevice = alarmDevice;
		 this.viewer = viewer;
	}
    
    //xml일때는 이렇게 나눠야 한다 set메서드의 파라미터는 하나만 가질수 있어서 ..
    public void setAlarmDevice(AlarmDevice alarmDevice) {
		this.alarmDevice = alarmDevice;
		
	}
	
	public void setViewer(Viewer viewer) {
		this.viewer = viewer;
	}
    
    
    
    
    
    
    
    //anno로 할 때 컨테이너 
    @Bean
    public KenziHomeController kenziHomeController() {
		KenziHomeController kenziHomeController = new KenziHomeController();
   		kenziHomeController.prepare(alarmDevice(),viewer()); 
    }
    
    
    //xml로 할 때 컨테이너 
   <bean id = "kenziHomeController" class = "KenziHomeController">
   		<property name = "alarmDevice" ref = "alarmDevice" />
		<property name = "viewer" ref = "viewer" />
   </bean>

 

xml이 가독성은 좋으나 setter로밖에 메서드를 못 넣어서 그게 좀 불편하다 어노테이션으로 하면 메서드 만들어서 여러개 넣으면 되는데....

 


오늘 저녁은

1. 자바 인터페이스, 인스턴스 개념 다시 잡고 

2. 노마드 코더 강의 

3. 정처기 실기 정리 

'Spring' 카테고리의 다른 글

pom.xml이 무엇인지 정리해보자 ..  (0) 2022.04.04
AOP  (0) 2022.04.04
스프링 4일차 정리  (0) 2022.03.31
스프링은 3가지로 끝난다  (0) 2022.03.31
컨테이너와 빈 방식에 관하여  (0) 2022.03.30
Comments