Loading [MathJax]/jax/output/HTML-CSS/config.js
Post

[Spring Boot] Bean, ์ƒ๋ช… ์ฃผ๊ธฐ, Bean Scope

[Spring Boot] Bean, ์ƒ๋ช… ์ฃผ๊ธฐ, Bean Scope

๐Ÿ“Œ Bean์ด๋ž€?

Bean ์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ IoC(Inversion of Control) ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

Spring Boot์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š”IoC(Inversion of Control)์ด๋‹ค. IoC๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ์ œ์–ด๊ถŒ, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ Spring Boot Framework์—๊ฒŒ ๋งก๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ Spring Boot์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” bean์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

IoC ์ปจํ…Œ์ด๋„ˆ๋Š” bean์œผ๋กœ ๋“ฑ๋กํ•  ํด๋ž˜์Šค๋“ค์„ ์ž๋™์œผ๋กœ ํƒ์ƒ‰ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ Component Scan ์ด๋ผ๊ณ  ํ•œ๋‹ค.

bean์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ป๋Š” ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์บก์Аํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. Dependency Injection, DI (์˜์กด์„ฑ ์ฃผ์ž…) ์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

Dependency Injection ์€ ๊ฐ์ฒด ๊ฐ„ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜์กด์„ฑ์ด๋ž€ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋“ˆํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ Bean์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • ApplicationContext ๋Š” IoC ์ปจํ…Œ์ด๋„ˆ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. bean์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๊ด€๋ฆฌ์™€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • Bean ์€ IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ์บก์Аํ™”ํ•œ๋‹ค.

  • Dependency Injection(DI) ๋Š” ํด๋ž˜์Šค ๊ฐ„ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ bean ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.

Bean์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. XML
1
2
3
<bean id="myBean" class="com.example.MyClass">
    <property name="propertyName" value="propertyValue"/>
</bean>

<bean> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์™€ ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.

  1. Java ๊ธฐ๋ฐ˜
1
2
3
4
5
6
7
8
@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Configuration, @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด Java ์ฝ”๋“œ๋กœ bean์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜
1
2
3
4
@Component
public class MyService {
    // ...
}

@Component, @Service, @Repository, @Controller ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ bean์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ @Service, @Repository, @Controller์™€ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์€ @Component์˜ ์ƒ์†์„ ๋ฐ›๊ณ  ์žˆ๋‹ค.

DI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ์ƒ์„ฑ์ž ์ฃผ์ž…
1
2
3
4
5
6
7
8
9
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

๊ฐ์ฒด์˜ ์˜์กด ๊ด€๊ณ„๊ฐ€ ํ•œ ๋ฒˆ ์ฃผ์ž…๋˜๋ฉด ๋‹ค์‹œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ ์‹œ Mock ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ํ•„๋“œ ์ฃผ์ž…
1
2
3
4
5
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

์˜์กด์„ฑ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์œผ๋ฉฐ ํ…Œ์ŠคํŠธ ์‹œ Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์–ด๋Ÿฝ๋‹ค. ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  1. Setter ์ฃผ์ž…
1
2
3
4
5
6
7
8
9
@Service
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

์„ ํƒ์ ์ธ ์˜์กด์„ฑ์ด๋‚˜ ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ์˜์กด์„ฑ์— ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿ“Œ Bean์˜ ์ƒ๋ช… ์ฃผ๊ธฐ

bean์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ฐ์ฒด ์ƒ์„ฑ(Instantiation)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋“ฑ๋ก๋œ bean์„ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํƒ์ƒ‰ํ•œ๋‹ค. ์ƒ์„ฑ์ž๋Š” ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ๋‹ค. bean์ธ ๊ธฐ๋ณธ์ ์œผ๋กœ singleton ์Šค์ฝ”ํ”„์—์„œ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋œ๋‹ค.

์˜์กด์„ฑ ์„ค์ •(Dependency Injection)

IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์—ฌ bean์„ ๊ตฌ์„ฑํ•œ๋‹ค.

์ดˆ๊ธฐํ™”(Initialization)

bean์ด ์ดˆ๊ธฐํ™”๋œ ํ›„ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„์ด๋‹ค.

์‚ฌ์šฉ(Ready to Use)

bean์ด ์ดˆ๊ธฐํ™”๋˜์—ˆ๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์†Œ๋ฉธ(Destruction)

IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ bean์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์†Œ๋ฉธํ•œ๋‹ค.

๐Ÿ“Œ Bean์˜ ์Šค์ฝ”ํ”„

bean์˜ ์Šค์ฝ”ํ”„์— ๋”ฐ๋ผ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ bean์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค.

Singleton Scope

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

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด ์ƒ์„ฑ๋˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธ๋œ๋‹ค.

Prototype Scope

๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. state๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด์— ์ ํ•ฉํ•˜๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€, Singleton bean์— Prototype bean์„ ์ฃผ์ž…ํ•˜๋ฉด Prototype bean์ด Singleton bean์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

bean ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒ์„ฑ๋˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹ˆ๋ผ GC์— ์˜ํ•ด ์†Œ๋ฉธ๋œ๋‹ค.

Request Scope

HTTP ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋™์ผํ•œ ์š”์ฒญ ๋‚ด์—์„œ๋งŒ state๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

HTTP ์š”์ฒญ์ด ์‹œ์ž‘๋˜๋ฉด ์ƒ์„ฑ๋˜๋ฉฐ, ์š”์ฒญ์ด ์ข…๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธ๋œ๋‹ค.

Session Scope

์‚ฌ์šฉ์ž ์„ธ์…˜ ๋‹น ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋ณ„๋กœ state๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

์„ธ์…˜์ด ์ƒ์„ฑ๋˜๋ฉด ์ƒ์„ฑ๋˜๋ฉฐ ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธํ•œ๋‹ค.

Application Scope

ServiceContext ๋‹น ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ๊ณต์œ ๋œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด ์ƒ์„ฑ๋˜๋ฉฐ ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธ๋œ๋‹ค.

WebSocket Scope

WebSocket ์„ธ์…˜๋ณ„๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

WebSocket ์—ฐ๊ฒฐ ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธ๋œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.