skip to content
Q

[Spring๐ŸŒฑ] Bean ์ง€์—ฐ ์ดˆ๊ธฐํ™”,์ฆ‰์‹œ ์ดˆ๊ธฐํ™”

/ 4 min read

Table of Contents

๐ŸŒŸ Spring์—์„œ์˜ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹: Lazy vs Eager

Spring์—์„œ ๋นˆ(bean)์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ธ ์ง€์—ฐ ์ดˆ๊ธฐํ™”(Lazy Initialization)์™€ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”(Eager Initialization)๊ฐ€ ์žˆ๋‹ค.


๐Ÿš€ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™” (Eager Initialization)

Spring์˜ ๊ธฐ๋ณธ ์„ค์ •์€ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”์ด๋‹ค.
์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ชจ๋“  ๋นˆ์„ ์ฆ‰์‹œ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ๋นˆ์ด ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ์–ด, ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์žฅ์ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์—๋Š” ๋นˆ ์ดˆ๊ธฐํ™” ์ง€์—ฐ์ด ์—†์–ด ์„ฑ๋Šฅ์ด ์•ˆ์ •์ .
  • ์ดˆ๊ธฐํ™”๊ฐ€ ๋นจ๋ฆฌ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ๋””๋ฒ„๊น… ์‹œ ๋ฒ„๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ.

๋‹จ์ 

  • ํ•„์š” ์—†๋Š” ๋นˆ๋„ ์ดˆ๊ธฐํ™”ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ.

โณ ์ง€์—ฐ ์ดˆ๊ธฐํ™” (Lazy Initialization)

์ง€์—ฐ ์ดˆ๊ธฐํ™”๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ๋ชจ๋“  ๋นˆ์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹.
@Lazy ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋นˆ๋งŒ ์ง€์—ฐ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ „์ฒด ๋นˆ์— ๋Œ€ํ•ด ์ง€์—ฐ ์ดˆ๊ธฐํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์–ด.

์žฅ์ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ผ ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๋นจ๋ผ์ง.
  • ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ ๊ฐ€๋Šฅ.

๋‹จ์ 

  • ๋นˆ์„ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™”๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ.
  • ์ดˆ๊ธฐํ™” ํƒ€์ด๋ฐ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ.

๐Ÿ“‹ ์˜ˆ์ œ ์ฝ”๋“œ

package com.example.lazyinitialization;
import org.springframework.context.annotation.*;
@Component
class ClassA {
public ClassA() {
System.out.println("ClassA initialized");
}
}
@Component
@Lazy
class ClassB {
private final ClassA classA;
public ClassB(ClassA classA) {
System.out.println("ClassB initialized");
this.classA = classA;
}
public void doSomething() {
System.out.println("Doing something...");
}
}
@Configuration
@ComponentScan
public class LazyInitializationExample {
public static void main(String[] args) {
var context = new AnnotationConfigApplicationContext(LazyInitializationExample.class);
System.out.println("Context initialized");
context.getBean(ClassB.class).doSomething();
}
}

๐Ÿ–ฅ๏ธ ์ถœ๋ ฅ ๊ฒฐ๊ณผ

์‹คํ–‰๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Œ:

ClassA initialized
Context initialized
ClassB initialized
Doing something...

๐Ÿ“Œ ์š”์•ฝ

  • ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋นˆ์„ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ•จ. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ค‘ ์„ฑ๋Šฅ์ด ์•ˆ์ •์ ์ด์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.
  • ์ง€์—ฐ ์ดˆ๊ธฐํ™”: ํ•„์š”ํ•œ ์‹œ์ ์— ๋นˆ์„ ์ดˆ๊ธฐํ™”ํ•จ. ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ๊ณผ ๋น ๋ฅธ ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ.

๐Ÿ’ก ํŒ
์ง€์—ฐ ์ดˆ๊ธฐํ™”๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•จ. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋นˆ์— ์ ์šฉํ•˜๋ฉด ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘์š”ํ•œ ๋นˆ์€ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒŒ ์ข‹์Œ.