(Spring) Singleton, Prototype

Spring

06/17/2021





μŠ€ν”„λ§ 빈 μŠ€μ½”ν”„

μ˜€λΈŒμ νŠΈκ°€ μƒμ„±λ˜κ³ , μ μš©λ˜λŠ” λ²”μœ„λ₯Ό 빈의 μŠ€μ½”ν”„(Scope)라고 ν•œλ‹€.

μŠ€ν”„λ§ 빈의 κΈ°λ³Έ μŠ€μ½”ν”„λŠ” 싱글톀이닀.

싱글톀 μŠ€μ½”ν”„λŠ” κ°•μ œμ œκ±°ν•˜μ§€ μ•ŠλŠ” ν•œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ‘΄μž¬ν•˜λŠ” λ™μ•ˆ 계속 μœ μ§€λœλ‹€.

κ²½μš°μ—λ”°λΌμ„œ 싱클톀 μ™Έμ˜ μŠ€μ½”ν”„λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

  • ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„
  • μš”μ²­ μŠ€μ½”ν”„
  • μ„Έμ…˜ μŠ€μ½”ν”„

λ“±λ“±...

이 쀑 μŠ€ν”„λ§μ—μ„œμ˜ 싱글톀과 ν”„λ‘œν† νƒ€μž…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.




πŸ‘©β€πŸ’» Singleton


μŠ€ν”„λ§ μ‹±κΈ€ν†€μ΄λž€?

  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘κ³Ό μ’…λ£ŒκΉŒμ§€ 1개의 객체둜 μœ μ§€λ¨
  • μŠ€ν”„λ§μ„ ν†΅ν•΄μ„œ bean을 μ œκ³΅λ°›μœΌλ©΄ μ–Έμ œλ‚˜ μ£Όμž…λ°›μ€ bean은 λ™μΌν•œ κ°μ²΄λΌλŠ” κ°€μ •ν•˜μ—μ„œ κ°œλ°œμ„ ν•œλ‹€.


πŸ‘©β€πŸ’» Prototype


λΉˆμ„ μ£Όμž…λ°›μ„ λ•Œλ§ˆλ‹€ 맀번 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©


JSX
@Component @Scope("prototype")
public class Proto {}
JAVA
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
// ν”„λ‘œν† νƒ€μž…
System.out.println("proto");
System.out.println(ctx.getBean(Proto.class));
System.out.println(ctx.getBean(Proto.class));
System.out.println(ctx.getBean(Proto.class));
// 호좜될 λ•Œλ§ˆλ‹€ 정보 닀름
// 싱글톀
System.out.println("single");
System.out.println(ctx.getBean(Single.class));
System.out.println(ctx.getBean(Single.class));
System.out.println(ctx.getBean(Single.class));
// 정보 κ°™μŒ
}
}


πŸ‘©β€πŸ’» μŠ€μ½”ν”„μ˜ 혼용

ν”„λ‘œν† νƒ€μž…μ—μ„œ 싱글톀 λΉˆμ„ μ°Έμ‘°ν•  경우


β†’ ν”„λ‘œν† νƒ€μž…μ˜ λΉˆμ€ 맀번 μƒˆλ‘œ μƒμ„±λ˜λŠ” 반면, 싱글톀 κ°μ²΄λŠ” μ–Έμ œλ‚˜ λ™μΌν•˜λ‹€.

JAVA
@Component @Scope("prototype")
public class Proto {
@Autowired
Single single;
}

싱글톀 빈이 ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ°Έμ‘°ν•  경우

JAVA
@Component
public class Single {
@Autowired
Proto proto;
public Proto getProto() {
return proto;
}
}
JAVA
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("proto by single");
System.out.println(ctx.getBean(Single.class).getProto());
System.out.println(ctx.getBean(Single.class).getProto());
System.out.println(ctx.getBean(Single.class).getProto());
}
}

β†’ 싱글톀 빈 μΈμŠ€ν„΄μŠ€κ°€ ν•œλ²ˆ λ§Œλ“€μ–΄μ§€κ³ , 이 λ•Œ ν”„λ‘œν† νƒ€μž…μ˜ 빈 μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ„ μ„ΈνŒ…μ΄ λœλ‹€.

이 λ•Œ 싱글톀 λΉˆμ„ 맀번 ν˜ΈμΆœν• λ•Œλ§ˆλ‹€ ν”„λ‘œν† νƒ€μž…μ˜ λΉˆλ„ μ²˜μŒμ— μ„ΈνŒ…λœ μΈμŠ€ν„΄μŠ€λ‘œ 고정이 λœλ‹€.


πŸ’‘ ν”„ν† λ‘œνƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€κ°€ μ •μƒμ μœΌλ‘œ μƒμ„±λ˜κ²Œ ν•˜λ €λ©΄ ?

β†’ proxyMode μ„€μ •

JAVA
@Component @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Proto {
@Autowired
Single single;
}
  • DEFAULT : ν”„λ‘μ‹œ μ‚¬μš© μ•ˆν•¨
  • TARGET_CLASS : λ‹€μ΄λ‚˜λ―Ή ν”„λ‘μ‹œ 적용
  • INTERFACES : μΈμŠ€ν„΄μŠ€ ν”„λ‘μ‹œ 생성




좜처 - https://blossun.github.io/spring/core-technology/01_IoC-μ»¨ν…Œμ΄λ„ˆμ™€-빈_05/


WRITTEN BY

Keep It Simple, Stupid