[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์ ๊ฐ์ ์ ๋ ธํ ์ด์ ์ ์ง์ํ๋ฏ๋ก ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋๊ธ