Notice
Recent Posts
Link
Today
Total
10-06 00:17
๊ด€๋ฆฌ ๋ฉ”๋‰ด

dingdong coding

Bean Scope - ProtoType Scope ๋ณธ๋ฌธ

๐ŸSpring/Basic

Bean Scope - ProtoType Scope

๐Ÿถ ๊ฐœ๋ฐœ๊ฐœ๋ฐœ ๐Ÿพ 2022. 6. 23. 23:00

Bean Scope ๋Š” ๋ง๊ทธ๋Œ€๋กœ ๋นˆ์ด ์กด์žฌํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

 

Bean Life Cycle ์—์„œ ์‚ดํŽด๋ดค๋“ฏ์ด ๋นˆ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์–ด์„œ Container๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Spring Container๋Š” ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค(Bean)๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.  ( ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋นˆ์€ ์Šค์ฝ”ํ”„๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ์‹ฑ๊ธ€ํ†ค์ด๋‹ค )

 

๋Œ€์ƒ ํด๋ž˜์Šค์— @Scope( ) ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์Šค์ฝ”ํ”„ ์ง€์ • 

//์ปดํฌ๋„ŒํŠธ ์Šค์บ” ์ž๋™ ๋“ฑ๋ก
@Scope("prototype") // @Scope(”singletone”)
@Component
public class HelloBean {}

//์ˆ˜๋™๋“ฑ๋ก 
@Scope("prototype") // @Scope(”singletone”)
@Bean
PrototypeBean HelloBean() {
	return new HelloBean();
}

 


Singleton Scope

 ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ๋๊นŒ์ง€ ํ•จ๊ป˜ํ•˜๋Š” ๋งค์šฐ ๊ธด ์Šค์ฝ”ํ”„

 ๊ธฐ๋ณธ ์Šค์ฝ”ํ”„, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ๊ฐ€์žฅ ๋„“์€ ๋ฒ”์œ„์˜ ์Šค์ฝ”ํ”„

 ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์Šคํ”„๋ง ๋นˆ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ ์‹œ์ ์— ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ์ข…๋ฃŒ๋  ๋•Œ๋„ ๋นˆ์˜ ์ข…๋ฃŒ๋ฉ”์„œ๋“œ ์‹คํ–‰ ๋จ

 

singleton

  ์‹ฑ๊ธ€ํ†ค ํƒ€์ž…์œผ๋กœ ์ ํ•ฉํ•œ ๊ฐ์ฒด

1)  ์ƒํƒœ๊ฐ€ ์—†๋Š” ๊ณต์œ  ๊ฐ์ฒด 

2)  ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด

3)  ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์ง€๋‹ˆ๋ฉด์„œ๋„ ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋งค์šฐ ๋†’์€ ๊ฐ์ฒด ( ๋‹จ, ์ด๋•Œ๋Š” ๋™๊ธฐํ™” ์ „๋žต์ด ํ•„์š” )

 

์Šคํ”„๋ง์€ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„ ์™ธ์—๋„ ํ”„๋กœํ†  ํƒ€์ž… ์Šค์ฝ”ํ”„, ์›น ๊ด€๋ จ ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค..

ProtoType Scope

ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„๋Š” ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…, ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐํ™”๊นŒ์ง€๋งŒ ์ง„ํ–‰ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค.

์ฆ‰, Spring Container๊ฐ€ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ์ƒ์„ฑ, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๊นŒ์ง€๋งŒ ๊ด€์—ฌํ•˜๋Š” ์งง์€ ๋ฒ”์œ„์˜ ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค.

ProtoType Scope ๋นˆ ์š”์ฒญ  

 ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜

  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…, ์ดˆ๊ธฐํ™” ๊นŒ์ง€๋งŒ ์ฒ˜๋ฆฌ

  ๋นˆ ์กฐํšŒ ์‹œ ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ , ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋„ ์กฐํšŒ ์‹œ ์ง„ํ–‰๋จ  

  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋นˆ์„ ๋ฐ˜ํ™˜ํ•œ ์ดํ›„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ƒ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  ๋นˆ์„ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ์— ๋นˆ์„ ๊ด€๋ฆฌํ•  ์ฑ…์ž„์ด ์žˆ์–ด์„œ  @PreDestory ๊ฐ™์€ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. 

  ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ํ•ด์•ผํ•œ๋‹ค. ( GC ์— ์˜ํ•ด ๋นˆ์ด ์ œ๊ฑฐ )

prototype

  ํ”„๋กœํ†  ํƒ€์ž…์œผ๋กœ ์ ํ•ฉํ•œ ๊ฐ์ฒด

1)  ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์ ธ์•ผํ•˜๋Š” ๊ฐ์ฒด 

2)  ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด 

ProtoType, Singleton ํ•จ๊ป˜ ์‚ฌ์šฉ ์‹œ ๋ฌธ์ œ์  

์Šคํ”„๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์ด ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํ†  ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜๋„์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ์„ฑ ์‹œ์ ์— ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ํ”„๋กœํ†  ํƒ€์ž… ๋นˆ์ด ์ƒ์„ฑ๋˜์–ด ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹ฑ๊ธ€ํ†ค ๋นˆ ๋‚ด๋ถ€์˜ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ํ•จ๊ป˜ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ๋นˆ ๋‚ด๋ถ€์˜ ํ”„๋กœํ†  ํƒ€์ž… ๋นˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ(๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค)์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

1 ) Provider

@Component
class ClientBean {

    @Autowired
    private Provider<PrototypeBean> provider;    //javax.inject ํ•˜์œ„ ํด๋ž˜์Šค๋กœ importํ•ด์•ผํ•จ

    public int logic() {
        PrototypeBean prototypeBean = provider.get();    // ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ ์š”์ฒญ
        prototypeBean.addCount();
        return prototypeBean.getCount();
    }
}

- logic() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ PrototypeBean ์ธ์Šคํ„ด์Šค๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

- Provider๋Š” ์ž๋ฐ” ํ‘œ์ค€์ด๋ผ์„œ ์Šคํ”„๋ง์— ๋…๋ฆฝ์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2 ) @Scope์˜ proxyMode ์„ค์ •

@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ProtoProxy {}

@Component
@AllArgsConstructor
public class ScopeWrapper {
    ...

    @Getter
    ProtoProxy protoProxy;
}

- ์œ„์™€ ๊ฐ™์ด Protytpe์— proxyMode ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

- ํ”„๋ก์‹œ ์ ์šฉ ๋Œ€์ƒ์ด ํด๋ž˜์Šค๋ฉด TARGET_CLASS, ์ธํ„ฐํŽ˜์ด์Šค๋ฉด INTERFACE๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

ํ•™์Šต์— ๋งŽ์€ ๋„์›€์ด ๋œ ๋งํฌ๋ฅผ  ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

 

์ฐธ์กฐ ๋ฐ ์ถœ์ฒ˜

[ Spring ] Spring Bean ์ด ์ •๋ฆฌ

 

 

'๐ŸSpring > Basic' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Bean Life Cycle  (0) 2022.06.23
Spring Singleton  (0) 2022.06.22
JDBC vs JDBC Template vs JPA  (0) 2022.06.18
Spring Framework, Spring Boot  (0) 2022.06.18
Spring Bean, Spring Container  (0) 2022.06.17
Comments