#10 ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ
by JiwonDevํด๋น ๊ธ์ ๊น์ํ๋์ ์ธํ๋ฐ ๊ฐ์๋ฅผ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
# ์คํ๋ง ๋น์ ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ด๋?
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฅ์ ํ์ด๋ ๋คํธ์ํฌ ์์ผ์ฒ๋ผ ์ฑ ์์ ์ง์ ์ ํ์ํ ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ํด๋๊ณ , ์ฑ ์ข ๋ฃ ์์ ์ ์ฐ๊ฒฐ์ ์์ ํ๊ฒ ์ข ๋ฃํ๋ ค๋ฉด ๊ฐ์ฒด์ ์ด๊ธฐํ์ ์ข ๋ฃ ์์ ์ ๋ฐ๋ก ๊ด๋ฆฌํด์ค ํ์๊ฐ ์๋ค. ์คํ๋ง์์ ์ฌ์ฉ๋๋ ์คํ๋ง ๋น์ด ์ธ์ ์ด๊ธฐํ ๋๊ณ ์ด๋ป๊ฒ ์ข ๋ฃ๋๋์ง ์์๋ณด์.
# ์คํ๋ง ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ ์์
๊ฐ๋จํ๊ฒ ์ธ๋ถ ๋คํธ์ํฌ์์ ๋ฏธ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด NetworkClient๋ ์ฑ ์์ ์์ ์ .connect()๋ฅผ ํธ์ถํ์ฌ ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ๋งบ์ด๋์ด์ผ ํ๊ณ , ์ฑ์ด ์ข ๋ฃ๋๋ฉด disConnect()๋ฅผ ํธ์ถํ์ฌ ์ฐ๊ฒฐ์ ๋์ด์ผ ํ๋ค.
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ url = " + url);
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
public void setUrl(String url) { this.url = url; }
private void call(String msg) { System.out.println("call = " + url + " msg = " + msg); }
private void connect() { System.out.println("connect = " + url);}
public void disconnect() { System.out.println("close = " + url); }
}
์์ฑ์ ๋ถ๋ถ์ ๋ณด๋ฉด url ์ ๋ณด ์์ด connect๊ฐ ํธ์ถ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋๋ฌด๋ ๋น์ฐํ ๋ง์ด์ง๋ง ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋จ๊ณ์์๋ url์ด ์๊ณ , ๋์ค์ ์ธ๋ถ์์ setter๋ก ์ฃผ์ ํด์ผ url์ ์ฌ์ฉํ ์ ์๋ค.
์คํ๋ง ๋น๋ ๋ค์๊ณผ ๊ฐ์ ๋ผ์ดํ์ฌ์ดํด์ ๊ฐ์ง๋ค. (์์ฑ์ ์ฃผ์ ์ ์ ์ธ. ํธ์ถ์ ์ฃผ์ ์ด ํจ๊ป๋จ)
[ ๊ฐ์ฒด ์์ฑ ] ํ -> [ ์์กด๊ด๊ณ ์ฃผ์ ]
์ฆ ์คํ๋ง ๋น๋, ์ ์์ ์ url์ฒ๋ผ ๊ฐ์ฒด ์์ฑ ํ ๋ฐ๋ก ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ ์๋๋ผ ์์กด๊ด๊ณ ์ฃผ์ ์ด ์๋ฃ ๋ ํ์ ํธ์ถํด์ผ ํ๋ค. ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์์กด๊ด๊ณ๊ฐ ์ฃผ์ ์ด ๋ชจ๋ ์๋ฃ๋ ์์ ์ ์ด๋ป๊ฒ ์๊ณ ์ฌ์ฉํ ๊น?
์คํ๋ง์ ์์กด๊ด๊ณ ์ฃผ์ ์ด ์๋ฃ๋๋ฉด ์คํ๋ง ๋น์๊ฒ ์ฝ๋ฐฑ ๋ฉ์๋์ ์ ๊ณตํ์ฌ ์ด๊ธฐํ ์์ ์ ์๋ ค์ฃผ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ํ ์คํ๋ง์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ์๋ฉธ ์ฝ๋ฐฑ์ ๋ฐ๋ก ์ค๋ค. ๋ฐ๋ผ์ ์์ ํ๊ฒ ์ข ๋ฃ ์์ ์ ์งํ ํ ์ ์๋ค.
# ์คํ๋ง ๋น์ ์ด๋ฒคํธ ๋ผ์ดํ ์ฌ์ดํด
[์คํ๋ง ์ปจํ ์ด๋ ์์ฑ] -> [์คํ๋ง ๋น ์์ฑ] -> [์์กด๊ด๊ณ ์ฃผ์ ] -> [์ด๊ธฐํ ์ฝ๋ฐฑ] -> [~์ฌ์ฉ~] -> [์๋ฉธ ์ฝ๋ฐฑ] -> [์คํ๋ง ์ฑ ์ข ๋ฃ]
์คํ๋ง์ ํฌ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค. ์์ฆ์ 3๋ฒ์งธ ๋ฐฉ๋ฒ๋ง ๊ฑฐ์ ์ฌ์ฉํ๋๋ฐ ๊ธฐ์กด์๋ ์ด๋ค๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋์ง ํ๋ฒ ์ฝ์ด๋ง ๋ณด๊ณ ๋์ด๊ฐ์.
- ์ธํฐํ์ด์ค (InitializingBean, DisposableBean)
- ์ค์ ์ ๋ณด์ ์ด๊ธฐํ ๋ฉ์๋, ์ข ๋ฃ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ง์
- @PostConstruct, @PreDestory ์ด๋ ธํ ์ด์
@ ์ธํฐํ์ด์ค ๊ตฌํ (InitializingBean, DisposableBean)
Spring์์ ํด๋น ์ธํฐํ์ด์ค์ ์๋ ๋ฉ์๋๋ฅผ ์ด๊ธฐํ, ์๋ฉธ ์์ ์ ํธ์ถํด์ค๋ค. ์ฐธ๊ณ ๋ก ์ด๋ ์ด์ฐฝ๊ธฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฐ์ฑ์ด ๋จ์ด์ง๊ณ ๋๋ฌด ์คํ๋ง์ ์์กด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋์ด ์ง๊ธ์ ์ ์ฐ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
public class SimpleClass implements InitializingBean, DisposableBean{
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("BEAN ์์ฑ ๋ฐ ์ด๊ธฐํ : afterPropertiesSet() ํธ์ถ๋จ");
}
@Override
public void destroy() throws Exception {
System.out.println("BEAN ์์ฑ ์๋ฉธ : destroy ํธ์ถ๋จ");
}
// ์ค๋ต...
}
@ ์ค์ ์ ๋ณด์ ์ด๊ธฐํ ๋ฉ์๋, ์ข ๋ฃ ๋ฉ์๋
์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ์์ ์ ๋ฉ์๋ ์ด๋ฆ์ ๋ฑ๋กํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ์ฌ์ฉํด์ ํด๋น ์ฝ๋๊ฐ ์คํ๋ง ์ธํฐํ์ด์ค์ ์์กดํ์ง ์๊ณ , ๊ฐ๋จํ ์ค์ ์ ๋ณด๋ฅผ ํตํด ์ ์ฉ์ํฌ ์ ์๋ค. * ์ฝ๋๊ฐ ์๋ ์ค์ ์ ๋ณด๋ฅผ ์ด์ฉํ๋๊ฑฐ๋ผ ์ฝ๋์ ์์ ๋ ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ด๊ธฐํ, ์ข ๋ฃ๋ฅผ ์ ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
// ์ด๋
ธํ
์ด์
@Bean(initMethod = "init", destroyMethod = "close")
// XML
<bean id="Bean" class="com.spring.bean.BSimpleClass"
init-method="init" destroy-method="destroy"/>
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
์ฐธ๊ณ ๋ก @Bean์ destoryMethod ์์ฑ์๋ ์์ฃผ ํน๋ณํ ๊ธฐ๋ฅ์ด ์๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ถ๋ถ์ close, shutdown ์ด๋ฆ์ ์ข ๋ฃ ๋ฉ์๋๋ก ์ฌ์ฉํ๋ค. @Bean(destoryMethod="...") ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ถ๋ก ๋ฉ์๋๋ก ์ ์๋์ด์๊ธฐ ๋๋ฌธ์, ๋ง์น ๋น์ด ์๋์ผ๋ก ๋ฑ๋ก๋๋ฏ์ด ํด๋น ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ฐพ์ ์๋์ผ๋ก ํธ์ถํด์ค๋ค. ์ฆ ๋ฐ๋ก ์ค์ ํด์ฃผ์ง ์์๋ ์ข ๋ฃ ๋ฉ์๋๋ ์ ์๋ํ๋๊ฑธ ๋ณผ ์ ์๋ค.
๋ง์ฝ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ซ๋ค๋ฉด destoryMethod="" ์ฒ๋ผ ๋น ๊ณต๋ฐฑ์ ์ง์ ํ๋ฉด ๋๋ค.
@PostConstruct, @PreDestory ์ด๋ ธํ ์ด์
์์ฆ์ ๋๋ถ๋ถ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ณ , ์คํ๋ง์์๋ ๊ถ์ฅํ๋ค. ์์ 2๊ฐ์ง๋ ์ด๋ ธํ ์ด์ ๋ฐฉ์์ด ๋์ค๊ธฐ ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ค์ด๋ค. ์ฐธ๊ณ ๋ก ํด๋น ์ด๋ ธํ ์ด์ ์ javax.annotation์ ์๋ ๊ฒ๋ค๋ก ์คํ๋ง์ด ์๋ ์๋ฐ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ ์ผํ ๋จ์ ์ ์์์ @Bean(~)์ผ๋ก ์ค์ ํ๋ ๋ฐฉ์์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฉํ ์ ์์ง๋ง, @PostConstruct๋ ์ฝ๋๋ฅผ ์์ ํด์ผํ๊ธฐ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉํ๊ธฐ ๊น๋ค๋กญ๋ค.
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
}
... ์๋ต ...
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
'๐ฑ Spring Framework > Spring Core' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ ๋น์ ์คํ๋ง#1 ์ค๋ธ์ ํธ์ ์์กด๊ด๊ณ (0) | 2021.08.14 |
---|---|
#11 ๋น ์ค์ฝํ(+Provider, ํ๋ก์ ๋ชจ๋) (0) | 2021.08.03 |
#9 ์์กด๊ด๊ณ ์๋์ฃผ์ ์์ ์๊ธฐ๋ ๋ฌธ์ (+Lombok ์๊ฐ) (0) | 2021.08.03 |
#8 ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋์ฃผ์ (0) | 2021.08.02 |
#7. ์คํ๋ง์ ์ฑ๊ธํค ์ปจํ ์ด๋ (@Configuration) (0) | 2021.08.02 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev