๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ
1. ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ ์์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ํ, ๋คํธ์ํฌ ์์ผ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์ ํ์ํ ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ํด๋๊ณ , ์ข ๋ฃ ์์ ์ ์ฐ๊ฒฐ์ ๋ชจ๋ ์ข ๋ฃํ๋ ์์ ์ ์งํํ๋ ค๋ฉด ๊ฐ์ฒด์ ์ด๊ธฐํ์ ์ข ๋ฃ ์์ ์ด ํ์ํ๋ค
์์ ์ฝ๋
// NetworkClient.java
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
public void setUrl(String url) {
this.url = url;
}
// ์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
// ์๋น์ค ์ข
๋ฃ ์ ํธ์ถ
public void disconnect() {
System.out.println("close: " + url);
}
}
// BeanLifeCycleTest.java
public class BeanLifeCycleTest {
@Test
public void lifeCycleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
NetworkClient client = ac.getBean(NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hellospring.dev");
return networkClient;
}
}
}
// ํ
์คํธ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = null
connect: null
call: null message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
๊ฐ์ฒด ์์ฑ ๋จ๊ณ์์๋ url์ด ์์ผ๋ฏ๋ก url ์ ๋ณด๊ฐ ํธ์ถ๋์ง ์๋๋ค
url์ ๊ฐ์ฒด ์์ฑ ์ดํ ์์ฅ์ ์ฃผ์
์ ํตํด setUrl()
์ด ํธ์ถ๋์ด์ผ ์กด์ฌํ๊ฒ ๋๋ค.
์คํ๋ง ๋น ์ด๋ฒคํธ ๋ผ์ดํ์ฌ์ดํด
โ ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ -> ์คํ๋ง ๋น ์์ฑ -> ์์กด๊ด๊ณ ์ฃผ์ -> ์ด๊ธฐํ ์ฝ๋ฐฑ -> ์ฌ์ฉ -> ์๋ฉธ์ ์ฝ๋ฐฑ -> ์คํ๋ง ์ข ๋ฃ
๊ฐ์ฒด๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋๋ ๋ค์์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ค
์คํ๋ง์์ ์์ฑ/์๋ฉธ ์ฝ๋ฐฑ ๋ฉ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋ค
์ฐธ๊ณ : ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ด๊ธฐํ ๋ถ๋ฆฌ
์์ฑ์๋ ํ์ ์ ๋ณด(ํ๋ผ๋ฏธํฐ)๋ฅผ ๋ฐ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ ๊ฐ์ฒด๋ฅผ ์์ฑ
๋ฐ๋ฉด, ์ด๊ธฐํ๋ ์์ฑ๋ ๊ฐ๋ค์ ํ์ฉํด ์ธ๋ถ ์ปค๋ฅ์ ์ ์ฐ๊ฒฐํ๋ ๋ฑ ๋ฌด๊ฑฐ์ด ๋์ ์ํ
โ ๋ฐ๋ผ์ ์์ฑ์ ์์์ ๋ฌด๊ฑฐ์ด ์ด๊ธฐํ ์์ ์ ํจ๊ป ์งํํ๋ ๊ฒ๋ณด๋ค ์์ฑ๊ณผ ์ด๊ธฐํ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ ์ง ๋ณด์ ๊ด์ ์์ ๋ฐ๋์ง
์ด๊ธฐํ ์์ ์ด ๊ฐ๋ณ๊ณ ๋จ์ํ ๊ฒฝ์ฐ์๋ ์์ฑ์์์ ํ๋ฒ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
์คํ๋ง์ 3๊ฐ์ง ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ
- ์ธํฐํ์ด์ค(InitializingBean, DisposableBean)
- ์ค์ ์ ๋ณด์ ์ด๊ธฐํ ๋ฉ์๋, ์ข ๋ฃ ๋ฉ์๋ ์ง์
@PostConstruct
,@PreDestroy
์ ๋ ธํ ์ด์ ์ง์
2. ์ธํฐํ์ด์ค(InitializingBean, DisposableBean)
์ ์ฉ ์ฝ๋
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//์๋น์ค ์ข
๋ฃ์ ํธ์ถ
public void disConnect() {
System.out.println("close + " + url);
}
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
@Override
public void destroy() throws Exception {
disConnect();
}
}
InitializingBean
์ afterPropertiesSet()
๋ฉ์๋๋ก ์ด๊ธฐํ๋ฅผ ์ง์ํ๋ค.
DisposableBean
์ destroy()
๋ฉ์๋๋ก ์๋ฉธ์ ์ง์ํ๋ค.
์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = null
NetworkClient.afterPropertiesSet
connect: http://hello-spring.dev
call: http://hello-spring.dev message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
13:24:49.043 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.destroy
close + http://hello-spring.dev
์ด๊ธฐํ ๋ฉ์๋๊ฐ ์์กด์ฑ ์ฃผ์ ์ดํ์ ํธ์ถ๋๋ค
์คํ๋ง ์ปจํ ์ด๋ ์ข ๋ฃ์๋ฐ๋ผ ์๋ฉธ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค
๋จ์
์คํ๋ง ์ ์ฉ ์ธํฐํ์ด์ค
์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋ ์ด๋ฆ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ
โ ๋ด๊ฐ ์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉ ๋ถ๊ฐ๋ฅ
์์ ๊ฐ์ ๋จ์ ๋๋กค ์ธํด ์ต๊ทผ์๋ ์์ฃผ ์ฌ์ฉx
3. ๋น ๋ฑ๋ก, ์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋ ์ง์
์ค์ ์ ๋ณด์ @Bean(initMethod = "init", destroyMethod = "close")
์ฒ๋ผ ์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
์ ์ฉ ์ฝ๋
// NetworkClient.java
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//์๋น์ค ์ข
๋ฃ์ ํธ์ถ
public void disConnect() {
System.out.println("close + " + url);
}
public void init() {
System.out.println("NetworkClient.init");
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
// LifeCycleConfig.java
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
์ค์ ์ ๋ณด์ ์ด๊ธฐํ ์๋ฉธ ๋ฉ์๋๋ฅผ ์ง์ ํด์ค๋ค
์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = null
NetworkClient.init
connect: http://hello-spring.dev
call: http://hello-spring.dev message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
13:33:10.029 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.close
close + http://hello-spring.dev
์ค์ ์ ๋ณด ์ฌ์ฉ์ ์ฅ์
๋ฉ์๋ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ค ์ ์๋ค
์คํ๋ง๋น์ด ์คํ์ด ์ฝ๋์ ์์กดํ์ง ์๋๋ค
โ ์ฝ๋๊ฐ ์๋ ์ค์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ด๊ธฐํ, ์ข ๋ฃ ๋ฉ์๋ ์ ์ฉ ๊ฐ๋ฅ
์ข ๋ฃ ๋ฉ์๋ ์ถ๋ก
โ @Bean์
destroyMethod
๋ ๊ธฐ๋ณธ๊ฐ์ด (inferred)
(์ถ๋ก )์ผ๋ก ๋ฑ๋ก๋์ด ์๋ค.
์ถ๋ก ๊ธฐ๋ฅ์ close
, shutdown
์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํด์ค๋ค
๋ฐ๋ผ์ ์ง์ ์คํ๋ง๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ์ข ๋ฃ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ ์ด์ฃผ์ง ์์๋ ๋์ํ๋ค
์ถ๋ก ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด destroyMethod=""
์ฒ๋ฝ ๋น ๊ณต๋ฐฑ ์ง์
Annotation @PostConstruct
, @PreDestroy
์ ์ฉ ์ฝ๋
// NetworkClient.java
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
// ์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
// ์๋น์ค ์ข
๋ฃ ์ ํธ์ถ
public void disconnect() {
System.out.println("close: " + url);
}
@PostConstruct
public void init() {
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์ธ์ง");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.destroy");
disconnect();
}
}
// LifeCycleConfig.java
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = null
NetworkClient.init
connect: http://hello-spring.dev
call: http://hello-spring.dev message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
19:40:50.269 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.close
close + http://hello-spring.dev
์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด ํธ๋ฆฌํ๊ฒ ์ด๊ธฐํ์ ์ข ๋ฃ๋ฅผ ์คํํ ์ ์๋ค
@PostConstruct
, @PreDestroy
์ ์ ๋
ธํ
์ด์
ํน์ง
โ ์ต์ ์คํ๋ง์์ ๊ฐ์ฅ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ
๊ฐํธํ๊ณ ํธ๋ฆฌ
javax
ํจํค์ง ์ฌ์ฉ: ์คํ๋ง ์ข
์์ ์ธ ๊ธฐ์ ์ด ์๋๋ผ ์๋ฐ ํ์ค ๊ธฐ์ -> ๋ค๋ฅธ ์ปจํ
์ด๋์์๋ ๋์
์ปดํฌ๋ํธ ์ค์บ๊ณผ ์ ์ด์ธ๋ฆผ
๋จ์ : ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ ๋ถ๊ฐ -> @Bean ๊ธฐ๋ฅ ์ฌ์ฉ
์ ๋ฆฌ
โ ๊ธฐ๋ณธ์ ์ผ๋ก๋ @PostConstruct
, @PreDestroy
์ ๋
ธํ
์ด์
์ ์ฌ์ฉ
โ ์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๊ธฐํ, ์ข
๋ฃํด์ผ ํ๋ฉด @Bean
์ initMethod
, destroyMethod
์ฌ์ฉํ์
'โญ Personal_Study > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA์์ Wrapper class vs primitive type (0) | 2023.04.17 |
---|---|
Page ๊ฐ์ฒด์ Collections ๋ฉ์๋๋ฅผ ์ ์ฉํ์ ๋ UnsupportedOperationException ๋ฐ์ ์๋ฌ (0) | 2023.03.30 |
์์กด๊ด๊ณ ์๋ ์ฃผ์ (1) | 2023.01.09 |
ComponentScan (0) | 2023.01.07 |
Singleton Container (0) | 2023.01.06 |
๋๊ธ