[Spring] Bean*

[verify$y]ยท2025๋…„ 5์›” 26์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
6/16

๐Ÿ’ก Spring ํ•ต์‹ฌ ๊ฐœ๋… ์ธํ„ฐ๋ทฐ Q&A


Q. Bean์ด๋ž€

  • SpringBean์€ ๋‹จ์ˆœํžˆ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ SpringContainer(ApplicationContext)์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๊ณ  lifeCylcle์ด ์ œ์–ด๋˜๋Š” ์ธ์Šคํ„ด์Šค
  • Spring์ด IoC ์›์น™์— ๋”ฐ๋ผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  DI๋กœ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • @Component, @Service, @Repository, @Controller ๋˜๋Š” @Bean์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
  • Spring์—์„œ Bean์€Spring Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋‹จ์œ„ ๊ฐ์ฒด์ด๋ฉฐ,
  • ์ƒ๋ช…์ฃผ๊ธฐ์™€ Scope, ์ฃผ์ž… ๋ฐฉ์‹์— ๋”ฐ๋ผ ์„ค๊ณ„์™€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ง•

  • IoC์— ์˜ํ•ด ๊ฐ์ฒด ์ƒ์„ฑ, DI, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ Spring์ด ๋‹ด๋‹น
  • AOP, ํŠธ๋žœ์žญ์…˜, Validator ๋“ฑ Spring ๊ธฐ๋Šฅ์˜ ์ ์šฉ ๋Œ€์ƒ
  • ์‹ฑ๊ธ€ํ†ค ์บ์‹œ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ์ƒํƒœ๋ฅผ ๊ฐ–๋Š” ํ•„๋“œ๋ฅผ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

์ƒ์„ฑ

  • ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜
    • ํด๋ž˜์Šค์— @Component, @Service, @Controller ๋“ฑ ๋ถ€์—ฌ
  • Java Config ๊ธฐ๋ฐ˜
    • @Configuration ํด๋ž˜์Šค์—์„œ @Bean ๋ฉ”์„œ๋“œ




Q. ๋นˆ ๋“ฑ๋ก ์ƒ์„ฑ

  • ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์• ๋…ธํ…Œ์ด์…˜๊ธฐ๋ฐ˜, Config๊ธฐ๋ฐ˜ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

@Component vs @Bean

  • @Component(@Service, @Repository, @Controller)๋Š” ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”ํžˆ์—ฌ ๋นˆ์„ ์ž๋™ ๋“ฑ๋ก, ํด๋ž˜์Šค๋‹จ์— ์„ ์–ธ
  • @Bean์€ ์ง์ ‘ ์„ ์–ธํ•ด์•ผ ๋นˆ ๋“ฑ๋ก๋œ๋‹ค. ๋ฉ”์„œ๋“œ ๋‹จ์— ์„ ์–ธ


Q.Bean ์ƒ๋ช…์ฃผ๊ธฐ๋ž€

  1. ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๋˜์–ด BeanDefinition ์ƒ์„ฑ โ†’ ๋“ฑ๋ก
  2. ์ƒ์„ฑ์žํ˜ธ์ถœ๋˜๊ณ  ๊ฐ์ฒด ์ƒ์„ฑ(Bean ๊ฐ์ฒด ์ƒ์„ฑ (instantiateBean))
  3. ์˜์กด์„ฑ ์ฃผ์ž…
  4. ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ @PostConstruct
  5. ์ƒ์šฉ
  6. ์†Œ๋ฉธ ์ฝœ๋ฐฑ @PreDestroy


Q. Bean Scope

  • ๋นˆ์ด ์–ด๋–ป๊ฒŒ ์–ธ์ œ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง์˜ ๊ธฐ๋ณธ ๋นˆ ์Šค์ฝ”ํ”„๋Š” ์‹ฑ๊ธ€ํ†ค์ด๋‹ค
  • ์ฆ‰ ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋นˆ(์ธ์Šคํ„ด์Šค)๋งŒ ์กด์žฌํ•œ๋‹ค.
  • prototype์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋นˆ์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ singleton๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.
Scope์„ค๋ช…์‚ฌ์šฉ ํ™˜๊ฒฝ
singleton (๊ธฐ๋ณธ๊ฐ’)์ปจํ…Œ์ด๋„ˆ๋‹น ํ•œ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์ผ๋ฐ˜ ์„œ๋น„์Šค ๋กœ์ง
prototype์š”์ฒญ๋งˆ๋‹ค ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ (DI๋งŒ ํ•˜๊ณ  ์ดํ›„ ๊ด€๋ฆฌ X)์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด ๋“ฑ
requestHTTP ์š”์ฒญ๋งˆ๋‹ค ํ•œ ๊ฐœWeb Application
session์‚ฌ์šฉ์ž ์„ธ์…˜๋งˆ๋‹ค ํ•œ ๊ฐœWeb Application
applicationServletContext ๋ฒ”์œ„Web Application
websocketWebSocket ์—ฐ๊ฒฐ๋งˆ๋‹ค ํ•œ ๊ฐœ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๋“ฑ



Q. BeanScope์—์„œ ์‹ฑ๊ธ€ํ†ค๊ณผ ํ”„๋กœํ† ํƒ€์ž…

singleton

  • ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ ๋“ฑ๋ก๋œ ๋ชจ๋“  Bean์„ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”
  • ํ•˜๋‚˜์˜ Bean์„ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ๊ณต์œ 
  • ์ƒํƒœ(state)๊ฐ€ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋™์‹œ์„ฑ ์ฃผ์˜ ํ•„์š”

prototype

  • ์š”์ฒญ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Bean ์ƒ์„ฑ
  • ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…๊นŒ์ง€๋งŒ Spring์ด ๊ด€๋ฆฌ โ†’ ์ดํ›„๋Š” ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ
  • @PreDestroy ๋“ฑ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ


Q. Singleton ๋‚ด๋ถ€์—์„œ Prototype ์ฃผ์ž…์‹œ ์ฃผ์˜ํ•  ์ 

  • Spring์€ ์ƒ์„ฑ๊ณผ Di๊นŒ์ง€๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ดํ›„ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ
  • ์Šคํ”„๋ง์€ ์‹ฑ๊ธ€ํ†ค์ด ๊ธฐ๋ณธ์„ธํŒ…์ด๋ฏ€๋กœ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๊ฐ€ ์šฐ์„ ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ํ”„๋กœํ† ํƒ€์ž…๋นˆ์— ๊ฒฝ์šฐ์—, ์‹ฑ๊ธ€ํ†ค์—์„œ ํ”„๋กœํ† ํƒ€์ž…๋นˆ์„ ์ฃผ์ž…ํ•˜๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋œ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ์“ฐ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

@Component
public class SingletonService {
    @Autowired
    private PrototypeBean prototypeBean; 

    public void logic() {
        prototypeBean.doSomething(); // ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด
    }
}

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•1 : ObjectProvider

@Autowired
private ObjectProvider<PrototypeBean> prototypeProvider;

public void logic() {
    PrototypeBean bean = prototypeProvider.getObject(); // ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด
}

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•2 : @Lookup

@Lookup
public PrototypeBean getPrototypeBean() {
    return null; // Spring์ด ๋Ÿฐํƒ€์ž„์— ์ž๋™ ๊ตฌํ˜„
}



Q. Bean ๋“ฑ๋ก/์Šค์บ” ์‹œ ์ฃผ์˜ํ•  ์ 

  • ์ค‘๋ณต ๋“ฑ๋ก ์‹œ โ†’ NoUniqueBeanDefinitionException ๋ฐœ์ƒํ•˜๋ฉฐ ํ•ด๊ฒฐ : @Qualifier ๋˜๋Š” @Primary๋กœ ํ•ด๊ฒฐ
  • ์˜์กด์„ฑ ์ˆœํ™˜ ๋ฐœ์ƒ ์‹œ โ†’ BeanCurrentlyInCreationException ๋ฐœ์ƒํ•˜๋ฉฐ ํ•ด๊ฒฐ : ์ƒ์„ฑ์ž ์ฃผ์ž… + @Lazy ๋˜๋Š” ์„ธํ„ฐ ์ฃผ์ž… ๊ณ ๋ ค
  • ๋นˆ์ด ์•„๋‹Œ ๊ฐ์ฒด์— AOP ์ ์šฉ ๋ถˆ๊ฐ€


Q. Spring Bean์ด ์•„๋‹Œ ๊ฐ์ฒด์—๋Š” AOP๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋‚˜

  • Spring AOP๋Š” ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์ด๊ธฐ๋•Œ๋ฌธ์— spring Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” Bean๋งŒ ๊ฐ์Œ€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
  • Spring AOP๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean ๋“ฑ๋ก ์‹œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ”„๋ก์‹œ๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • Spring Container๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋Š” ํ”„๋ก์‹œ๋„ ์ƒ์„ฑ๋˜์ง€ ์•Š์•„ AOP๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ง์ ‘ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์—๋Š” ํ”„๋ก์‹œ๋„ ์—†๊ณ  AOP๋„ ์ ์šฉ์•Š๋œ๋‹ค.
profile
welcome

0๊ฐœ์˜ ๋Œ“๊ธ€