Java/Spring

[Spring] 06. applicationContext의 내부구조(Factory 패턴)

담크 2021. 6. 20. 20:32

spring에서 지금까지는 MTest에서 ApplicationContext factory = new .... 이러한 형식으로 작성해서 applicationContext 안에 생성되어있는 객체를 불러오는 작업을 했었습니다.

그렇다면 이게 내부적으로 어떻게 동작을 하는것인지에 대해 오늘 정리해보려고 합니다.

com.test06 패키지를 만들어줍니다.

이번엔 만들때부터 뭔가 어색하죠? ㅎㅎ

applicationContext.xml없이 전부 class로 만들어 줍니다.(TV는 인터페이스입니다.)

BeanFactory.java

package com.test06;

public class BeanFactory {
	
	public Object getBean(String beanName) {
		if(beanName.equals("samsong")) {
			return new SamsongTv();
		} else if(beanName.equals("ig")) {
			return new IgTv();
		}
		
		return null;
	}
}

IgTv.java

package com.test06;

public class IgTv implements TV {

	@Override
	public void powerOn() {
		System.out.println("ig tv on");
	}

	@Override
	public void powerOff() {
		System.out.println("ig tv off");
	}

	@Override
	public void volumeUp() {
		System.out.println("ig tv volume up");
	}

	@Override
	public void volumeDown() {
		System.out.println("ig tv volume down");
	}

}

SamsongTv.java

package com.test06;

public class SamsongTv implements TV {

	@Override
	public void powerOn() {
		System.out.println("samsong tv on");
	}

	@Override
	public void powerOff() {
		System.out.println("samsong tv off");
	}

	@Override
	public void volumeUp() {
		System.out.println("samsong tv volume up");
	}

	@Override
	public void volumeDown() {
		System.out.println("samsong tv volume down");
	}
}

TV.java

package com.test06;

public interface TV {
	
	void powerOn();
	void powerOff();
	void volumeUp();
	void volumeDown();

}

MTest.java

package com.test06;

public class MTest {
	
	public static void main(String[] args) {
		BeanFactory factory = new BeanFactory();
		TV tv = (TV) factory.getBean("samsong");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
		
	}
}

 

코드 실행결과 (MTest의 factory.getBean("ig"); 라면 samsong 대신 ig가 들어가야합니다.)

 

BeanFactory.java 형태를 spring에선 팩토리패턴 이라고 합니다. ( 100% 팩토리 패턴으로 보기엔 조금 애매하지만 최대한 비슷하게 만들어본 형태입니다.)

 

Spring framework 내부에서는 팩토리패턴, 싱글톤패턴, 디자인패턴 등 여러 가지 것들이 접목되어 있습니다.

그래서 내부적으로는 "samsong" 이라는 이름으로 가져와달라고 요청하면 항상 만들었던 applicationContext.xml 같이 bean태그 안에서 "samsong" 이라는 이름을 가진 만들어진 객체를 찾아서 리턴하자! 이런 형태인데

 

그것을 간소화시켜서 내부적으로 어떤 느낌으로 만들어졌는지 볼 수 있게 만들어 놓은 것이 BeanFactory.java 형태라고 할 수 있습니다. (spring을 아예 다 만들 수 없으니까 간소화시킨 거라고 보시면 됩니다....)

이처럼 factory.getBean에 찾고자 하는 객체의 이름을 넣어주면

같은 이름의 객체를 찾아서 그 객체를 리턴해주는 것입니다.

 

 

 

 

 

 

결론적으로

BeanFactory.java는 아래 그림같이 MTest에서 선언한 ApplicationContext 객체의 역할을 내부적으로 표현한 것입니다.