Spring

[Spring] μ• λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•œ 빈 μ„€μ • 방법 정리

Leica 2020. 4. 24. 02:39
λ°˜μ‘ν˜•

[Spring] μ• λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•œ λΉˆ μ„€μ • λ°©λ²• μ •λ¦¬

빈 섀정을 ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μŠ€ν”„λ§ μ• λ…Έν…Œμ΄μ…˜ @Required, @Autowired, @Qualifier, @Valueκ³Ό JSR-250 μ• λ…Έν…Œμ΄μ…˜ @PostConstruct, @PreDestroy, @Resource에 λŒ€ν•΄ μ•Œμ•„λ³΄μž

이 μ• λ…Έν…Œμ΄μ…˜λ“€μ„ μ‚¬μš©ν•΄ 기쑴에 XML 빈 μ„€μ • νŒŒμΌμ— λͺ¨λ‘ μž‘μ„±ν•˜λ˜ 빈 섀정을 빈 ν΄λž˜μŠ€μ— 직접 μ„€μ •ν•  수 μžˆλ‹€.

 

XML 섀정에 μ• λ…Έν…Œμ΄μ…˜ 빈 섀정을 μ‚¬μš©ν•˜κΈ° μœ„ν•œ μ½”λ“œ μΆ”κ°€

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
</beans>

context λ„€μž„ μŠ€νŽ˜μ΄μŠ€μ™€ <context:annotation-config/> μ½”λ“œλ₯Ό μΆ”κ°€ν•œλ‹€.

μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄ 빈 섀정을 XML 파일이 μ•„λ‹Œ 빈 클래슀의 μ• λ…Έν…Œμ΄μ…˜μ„ 검색해 λ°˜μ˜ν•œλ‹€.

 

@Required

- setter에 λΆ™μ—¬ λ°˜λ“œμ‹œ μ£Όμž…ν•΄μ•Όν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ μ„€μ •ν•˜λŠ” μ• λ…Έν…Œμ΄μ…˜
- Spring 5.1 버전 λΆ€ν„° Deprecated λ˜μ—ˆλ‹€. ➑️ λ°˜λ“œμ‹œ μ£Όμž…ν•΄μ•Ό ν•  ν”„λ‘œνΌν‹°λŠ” μƒμ„±μž μ£Όμž…μ„ μ΄μš©ν•œλ‹€.
- μŠ€ν”„λ§ 5.1이상을 μ‚¬μš©ν•˜κ±°λ‚˜ μžλ°” 파일둜 bean을 λ“±λ‘ν–ˆμ„ 경우 λ¬΄μ‹œλœλ‹€.

 

예제 μ½”λ“œ

public class TestBean1 {
	
	private int data1;

	public int getData1() {
		return data1;
	}
	
	// ν•„μˆ˜ μ£Όμž… ν”„λ‘œνΌν‹°
        // μŠ€ν”„λ§ 5.1이상을 μ‚¬μš©ν•˜κ±°λ‚˜ μžλ°” 파일둜 bean을 λ“±λ‘ν–ˆμ„ 경우 λ¬΄μ‹œλœλ‹€
	@Required
	public void setData1(int data1) {
		this.data1 = data1;
	}
}

@Configuration
public class BeanConfigClass {

	@Bean
	public TestBean1 testBean1() {
		return new TestBean1();
	}
}

 

@Autowired

- 객체 νƒ€μž…μ„ 톡해 빈 객체λ₯Ό μžλ™μœΌλ‘œ μ£Όμž…ν•œλ‹€.
- ν•„λ“œ, μƒμ„±μž, setter에 뢙일 수 μžˆλ‹€.
- ν•„λ“œ, setter에 λΆ™μ—¬μ„œ μ‚¬μš©ν•  경우 λ°˜λ“œμ‹œ κΈ°λ³Έ μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.
- ν•„λ“œμ— 뢙이면 setterλ₯Ό 톡해 μ£Όμž…λ˜λ©° setterκ°€ 없을 경우 컴파일 κ³Όμ •μ—μ„œ μžλ™μœΌλ‘œ μΆ”κ°€λœλ‹€.

 

예제 μžλ°” μ½”λ“œ

public class TestBean1 {

	// ν•„λ“œ μžλ™ μ£Όμž…
	// μžλ™μœΌλ‘œ setter λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜μ–΄ setter λ©”μ„œλ“œλ₯Ό 톡해 μ£Όμž…λœλ‹€.
	@Autowired
	private DataBean1 data3;
}

public class DataBean1 { }

 

μ„€μ • - μžλ°”

@Configuration
public class BeanConfigClass {

	@Bean
	public TestBean1 testBean1() {
		return new TestBean1();
	}
	
	@Bean
	public DataBean1 dataBean1() {
		return new DataBean1();
	}
}

 

μ„€μ • - XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	                    http://www.springframework.org/schema/beans/spring-beans.xsd
	                    http://www.springframework.org/schema/context
	                    http://www.springframework.org/schema/context/spring-context.xsd">
	                    
	<context:annotation-config/>
	
	<bean id='testBean1' class='com.atoz_develop.beans.TestBean1'/>
	<bean class='com.atoz_develop.beans.DataBean1'/>
	
</beans>

 

@Qualifier

- @Autowired와 ν•¨κ»˜ μ‚¬μš©ν•œλ‹€.
- @Autowiredλ₯Ό ν†΅ν•œ μžλ™ μ£Όμž… μ‹œ 같은 νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 μ •μ˜λ˜μ–΄ 있으면 @Qualifier에 μ„€μ •λ˜μ–΄ μžˆλŠ” λΉˆμ„ μ°Ύμ•„ μ£Όμž…ν•œλ‹€.

 

예제 μžλ°” μ½”λ“œ

public class TestBean1 {

	@Autowired
	@Qualifier("obj4")
	private DataBean2 data4;
	
	@Autowired
	@Qualifier("obj5")
	private DataBean2 data5;
}

public class DataBean2 { }

 

μ„€μ • - μžλ°”

@Configuration
public class BeanConfigClass {

	@Bean
	public TestBean1 testBean1() {
		return new TestBean1();
	}
	
	@Bean
	public DataBean2 obj4() {
		return new DataBean2();
	}
	
	@Bean
	public DataBean2 obj5() {
		return new DataBean2();
	}
}

 

μ„€μ • - XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	                    http://www.springframework.org/schema/beans/spring-beans.xsd
	                    http://www.springframework.org/schema/context
	                    http://www.springframework.org/schema/context/spring-context.xsd">
	                    
	<context:annotation-config/>
	
	<bean id='testBean1' class='com.atoz_develop.beans.TestBean1'/>
	<bean id='obj4' class='com.atoz_develop.beans.DataBean2'/>
	<bean id='obj5' class='com.atoz_develop.beans.DataBean2'/>

</beans>

 

@Value

- μƒμ„±μž μ£Όμž… μ‹œ μžλ™μœΌλ‘œ μ£Όμž…λ˜μ§€ μ•ŠλŠ” κΈ°λ³Έ μžλ£Œν˜•κ³Ό λ¬Έμžμ—΄μ˜ 값을 μ„€μ •ν•œλ‹€.

 

예제 μžλ°” μ½”λ“œ

public class TestBean2 {
	
	private int data1;
	private String data2;
	private DataBean3 data3;
	private DataBean4 data4;

	public TestBean2(@Value("100") int data1, @Value("λ¬Έμžμ—΄") String data2, DataBean3 data3, DataBean4 data4) {
		this.data1 = data1;
		this.data2 = data2;
		this.data3 = data3;
		this.data4 = data4;
	}
}

public class DataBean3 { }

public class DataBean4 { }

 

μ„€μ • - XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	                    http://www.springframework.org/schema/beans/spring-beans.xsd
	                    http://www.springframework.org/schema/context
	                    http://www.springframework.org/schema/context/spring-context.xsd">

	<context:annotation-config/>
	
	<bean id='testBean2' class='com.atoz_develop.beans.TestBean2'/>
	
	<bean class='com.atoz_develop.beans.DataBean3'/>
	<bean class='com.atoz_develop.beans.DataBean4'/>
	
</beans>

 

XML μ„€μ •μ—μ„œ <context:annotation-config/>λ₯Ό μΆ”κ°€ν•˜λ©΄ 빈 ν΄λž˜μŠ€μ— μ£Όμž… 섀정을 λ”°λ‘œ ν•˜μ§€ μ•Šμ•„λ„ μƒμ„±μž μ£Όμž…μ΄ μžλ™μœΌλ‘œ 이루어진닀.

μ΄λ•Œ κΈ°λ³Έ νƒ€μž…κ³Ό λ¬Έμžμ—΄ νƒ€μž…μ˜ ν•„λ“œλŠ” μžλ™μœΌλ‘œ μ£Όμž…λ˜μ§€ μ•ŠμœΌλ©° @Valueλ₯Ό μ‚¬μš©ν•΄μ„œ 값을 μ„€μ •ν•  수 μžˆλ‹€.

μžλ°” μ• λ…Έν…Œμ΄μ…˜ μ„€μ •(@Configuration)을 μ‚¬μš©ν• λ•ŒλŠ” 이 방법이 μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

 

JSR-250 μ• λ…Έν…Œμ΄μ…˜ μ˜μ‘΄μ„± μΆ”κ°€

<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

 

@PostConstruct

- @Bean(initMethod="...") λŒ€μ‹  μ‚¬μš©
- μƒμ„±μž 호좜 ν›„ μžλ™μœΌλ‘œ 호좜될 λ©”μ†Œλ“œμ— λΆ™μ—¬μ„œ μ‚¬μš©

@Configuration ν΄λž˜μŠ€μ—μ„œ @Bean의 initMethod 속성에 빈이 μƒμ„±λ λ•Œ 호좜될 λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•˜λŠ” λŒ€μ‹  빈의 클래슀의 λ©”μ†Œλ“œμ— @PostConstructλ₯Ό λΆ™μ—¬ 직접 μ„€μ •ν•  수 μžˆλ‹€.

 

예제 μ½”λ“œ

public class TestBean2 {

	// μƒμ„±μž 호좜 이후 μžλ™μœΌλ‘œ 호좜
	@PostConstruct
	public void init2() {
		System.out.println("TestBean2의 init λ©”μ„œλ“œ");
	}
}

 

μ„€μ •

@Configuration
public class BeanConfigClass {
	
	@Bean
	public TestBean2 obj2() {
		return new TestBean2();
	}
}

 

@PreDestroy

- @Bean(destroyMethod="...") λŒ€μ‹  μ‚¬μš©
- 객체 μ†Œλ©Έ μ „ μžλ™μœΌλ‘œ 호좜될 λ©”μ†Œλ“œμ— λΆ™μ—¬μ„œ μ‚¬μš©

@Configuration ν΄λž˜μŠ€μ—μ„œ @Bean의 destroyMethod 속성에 빈이 μƒμ„±λ λ•Œ 호좜될 λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•˜λŠ” λŒ€μ‹  빈의 클래슀의 λ©”μ†Œλ“œμ— @PostConstructλ₯Ό λΆ™μ—¬ 직접 μ„€μ •ν•  수 μžˆλ‹€.

 

예제 μ½”λ“œ

public class TestBean2 {
	
	// 객체가 μ†Œλ©Έλ˜κΈ° 전에 μžλ™μœΌλ‘œ 호좜
	@PreDestroy
	public void destroy2() {
		System.out.println("TestBean2의 destroy λ©”μ„œλ“œ");
	}
}

 

μ„€μ •

@Configuration
public class BeanConfigClass {
	
	@Bean
	public TestBean2 obj2() {
		return new TestBean2();
	}
}

 

@Resource

- 빈 이름(id)을 톡해 μžλ™ μ£Όμž…
- @Autowired + @Qualifier와 μœ μ‚¬
- ν•„λ“œλͺ…κ³Ό λ™μΌν•œ μ΄λ¦„μ˜ λΉˆμ„ μ£Όμž…
- ν•„λ“œλͺ…κ³Ό 빈 이름이 λ‹€λ₯΄λ©΄ @Resource(name=“…”)

 

πŸ‘‰ ν•„λ“œλͺ…κ³Ό 빈 이름(id)κ°€ λ™μΌν•œ 경우

예제 μ½”λ“œ

public class TestBean5 {
	
	// λ³€μˆ˜μ˜ 이름과 λ™μΌν•œ μ΄λ¦„μ˜ Bean이 μ£Όμž…λœλ‹€.
	@Resource
	private DataBean1 data1;
	
	@Resource
	private DataBean2 data2;
}

 

μ„€μ •

@Configuration
public class BeanConfigClass {
	
	@Bean
	public DataBean1 data1() {
		return new DataBean1();
	}
	
	@Bean
	public DataBean2 data2() {
		return new DataBean2();
	}
	
	@Bean
	public TestBean5 obj5() {
		return new TestBean5();
	}
}

 

πŸ‘‰ ν•„λ“œλͺ…κ³Ό 빈 이름(id)κ°€ λ‹€λ₯Έ 경우 - name 속성 μ‚¬μš©

예제 μ½”λ“œ

public class TestBean6 {
	
	@Resource(name = "data1")
	private DataBean1 data100;

	@Resource(name = "data2")
	private DataBean2 data200;
}

 

μ„€μ •

@Configuration
public class BeanConfigClass {
	
	@Bean
	public DataBean1 data1() {
		return new DataBean1();
	}
	
	@Bean
	public DataBean2 data2() {
		return new DataBean2();
	}
	
	@Bean
	public TestBean6 obj6() {
		return new TestBean6();
	}
}

TestBean6의 DataBean1νƒ€μž… ν•„λ“œλͺ…이 각각 data100, data200이고 빈 등둝은 data1, data2둜 λ˜μ–΄μžˆμœΌλ―€λ‘œ κ·Έλƒ₯ @Resourceλ₯Ό 뢙이면 μžλ™ μ£Όμž…μ΄ 이루어지지 μ•ŠλŠ”λ‹€.

이런 경우 @Resource의 name 속성을 μ‚¬μš©ν•΄μ„œ 빈 이름을 직접 μ§€μ •ν•œλ‹€.

 

Java의 annotation-apiλŠ” μŠ€ν”„λ§μ„ μœ„ν•œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ•„λ‹ˆλΌ μ—¬λŸ¬κ°€μ§€ μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— μ‚¬μš©ν•  수 μžˆλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.

μŠ€ν”„λ§μ—μ„œλ„ @PostConstruct, @PreDestroy, @Resource와 같은 μ• λ…Έν…Œμ΄μ…˜μ„ μ§€μ›ν•˜λ―€λ‘œ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

λ°˜μ‘ν˜•