Spring

Spring Bean ์ด๋ž€?

yjdat 2022. 10. 12. 14:00

๐Ÿ“‹ ๋ชฉ์ฐจ

Spring Bean ์ด๋ž€?

Java Bean๊ณผ๋Š” ๋‹ค๋ฅธ๊ฐ€?

์–ด๋–ป๊ฒŒ Spring IoC ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์„ ๋“ฑ๋กํ• ๊นŒ?

 


 

๐Ÿ”ถ Spring Bean ์ด๋ž€?

Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ '๋นˆ(Bean)' ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋จผ์ € IoC๋ฅผ ์„ค๋ช…์„ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๊ฐ ๊ฐ์ฒด๋“ค์ด ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ๊ฒฐ์ •ํ•˜๊ณ  ๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ์ž‘์—…(๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ž‘์—…์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A ๊ฐ์ฒด์—์„œ B ๊ฐ์ฒด์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด, B ๊ฐ์ฒด๋ฅผ ์ง์ ‘ A ๊ฐ์ฒด ๋‚ด์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ IoC๊ฐ€ ์ ์šฉ๋œ ๊ฒฝ์šฐ, ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ํŠน๋ณ„ํ•œ ๊ด€๋ฆฌ ์œ„์ž„ ์ฃผ์ฒด์—๊ฒŒ ๋งก๊น๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ปจํŠธ๋กคํ•˜๋Š” ์ฃผ์ฒด๋Š” ๋‹ค๋ฅธ ์ฃผ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์ œ์–ด๊ถŒ์„ ๋‹ค๋ฅธ ์ฃผ์ฒด์—๊ฒŒ ๋„˜๊ธฐ๋Š” ๊ฒƒ์„ IoC(์ œ์–ด์˜ ์—ญ์ „) ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

Spring์—์„œ๋Š” ์ง์ ‘ new๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, Spring์— ์˜ํ•˜์—ฌ ๊ด€๋ฆฌ ๋‹นํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ Spring์— ์˜ํ•˜์—ฌ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ Bean (IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ธ์Šคํ„ด์Šคํ™” ๋˜๊ณ  ์กฐ๋ฆฝ, ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด )์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์Šคํ”„๋ง์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ , ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์˜์กด์„ฑ ์ฃผ์ž…์ด ์ผ์–ด๋‚˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

Spring Framework ์—์„œ๋Š” Spring Bean์„ ์–ป๊ธฐ ์œ„ํ•˜์—ฌ ApplicationContext.getBean() ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Spring์—์„œ ์ง์ ‘ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์–ป์–ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ApplicationContext.getBean()๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์•ž์˜ ์ •์˜์— ์˜ํ•ด์„œ new ์ƒ์„ฑ์ž๋กœ ์–ป์€ ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, Spring์—์„œ์˜ ๋นˆ์€ ApplicationContext๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด, ์ฆ‰ ApplicationContext๊ฐ€ ๋งŒ๋“ค์–ด์„œ ๊ทธ ์•ˆ์— ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”ถ Java Bean๊ณผ๋Š” ๋‹ค๋ฅธ๊ฐ€?

Java Bean์€ ํŠน์ • ํ˜•ํƒœ์˜ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋œป์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

DTO or VO์˜ ํ˜•ํƒœ๊ฐ€ Java Bean์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ๋Š” private๋กœ ๊ตฌ์„ฑ๋˜์–ด getter์™€ setter๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ์ „๋‹ฌ ์ธ์ž๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๋Š” ํ˜•ํƒœ์˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

getter์™€ setter, ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋œป์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งŒํผ POJO(Plain Old Java Object)์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ๋ณธ๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

public class AboutJavaBean {

	// ํ•„๋“œ๋Š” private๋กœ ์„ ์–ธ
    private String beanName;
    private int beanValue;

	// ์ „๋‹ฌ ์ธ์ž๊ฐ€ ์—†๋Š”(no-argument) ์ƒ์„ฑ์ž
    public AboutJavaBean() {
    
    }
		
	// getter
    public String getBeanName() {
        return beanName;
    }
    
	// setter
    public void setBeanName(String bean) {
        this.beanName = beanName;
    }

	// getter
    public int getBeanValue() {
        return beanValue;
    }

	// setter
    public void setBeanValue(int beanValue) {
        this.beanValue = beanValue;
    }
}

 

๐Ÿ”ถ ์–ด๋–ป๊ฒŒ Spring IoC ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์„ ๋“ฑ๋กํ• ๊นŒ?

1) Java annotation์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.

์‚ฌ์ „ ์ƒ์œผ๋กœ๋Š” Annotation์€ ์ฃผ์„์„ ์˜๋ฏธํ•˜์ง€๋งŒ, ์ž๋ฐ”์—์„œ๋Š” ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Annotation์€ ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์ผ์ข…์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹จ์ˆœ ์ฃผ์„์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Parent { 
    public void doSomething() { 
        System.out.println("This is Parent"); 
    } 
} 

public class Son extends Parent{ 
    @Override 
	  // @Override๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์†์ž„์„ ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค.
    public void doSomething() { 
        System.out.println("This is Son"); 
    } 
}

Spring์—์„œ๋Š” Bean์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ @Component Annotation์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

@Component Annotation์ด ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Spring์ด Annotation์„ ํ™•์ธํ•˜๊ณ  ์ž์ฒด์ ์œผ๋กœ Bean ์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

// HelloController.java
@Controller
public class HelloController {
    // Http Get method ์˜ /hello ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ์ฒ˜๋ฆฌํ•  Method๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด @GetMapping Annotation์„ ์‚ฌ์šฉํ•˜์—ฌ Mapping์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data", "This is data!!");
        return "hello";
    }
}

Intellj๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด @Controller Annotation์— Ctrl ์„ ๋ˆŒ๋Ÿฌ์„œ ์ด๋™ํ•ด๋ณด๋ฉด @Controller Annotation์—๋Š” @Component Annotation์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @Component Annotation์œผ๋กœ ์ธํ•˜์—ฌ Spring์€ ํ•ด๋‹น Controller๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

// Controller.java

// -- ์ผ๋ถ€ ์ƒ๋žต --
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}

2) Bean Configuration File์— ์ง์ ‘ Bean ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•.

๋นˆ ์„ค์ • ํŒŒ์ผ์€ XML๊ณผ ์ž๋ฐ” ์„ค์ • ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ตœ๊ทผ ์ถ”์„ธ๋Š” ์ž๋ฐ” ์„ค์ • ํŒŒ์ผ์„ ์ข€ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Configuration๊ณผ @Bean Annotation์„ ์ด์šฉํ•˜์—ฌ Bean์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด @Configuration์„ ์ด์šฉํ•˜๋ฉด Spring Project์—์„œ์˜ Configuration ์—ญํ• ์„ ํ•˜๋Š” Class๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น File ํ•˜์œ„์— Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ ์ž ํ•˜๋Š” Class์— @Bean Annotation์„ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ Bean์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// Hello.java
//์ž๋ฐ” ์„ค์ •ํŒŒ์ผ์€ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ xxxxConfiguration์™€ ๊ฐ™์ด ๋ช…๋ช…ํ•œ๋‹ค.
//๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค์— @Configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.
//๊ทธ ์•ˆ์— @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๋นˆ์„ ์ •์˜ํ•œ๋‹ค.
@Configuration
public class HelloConfiguration {
    @Bean
    public HelloController sampleController() {
        return new SampleController;
    }
}

sampleController()์—์„œ return ๋˜๋Š” SampleController๊ฐ์ฒด๊ฐ€ IoC ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

๋นˆ์„ ์ง์ ‘ ์ •์˜ํ•ด์„œ ๋“ฑ๋กํ•˜๋ฉด @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

@Configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณด๋ฉด ์ด ์–ด๋…ธํ…Œ์ด์…˜๋„ @Component๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— @ComponentScan์˜ ์Šค์บ” ๋Œ€์ƒ์ด ๋˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋นˆ ์„ค์ • ํŒŒ์ผ์ด ์ฝํž ๋•Œ ๊ทธ ์•ˆ์— ์ •์˜ํ•œ ๋นˆ๋“ค์ด IoC ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 


reference

์ถœ์ฒ˜ : https://atoz-develop.tistory.com/entry/Spring-์Šคํ”„๋ง-๋นˆBean์˜-๊ฐœ๋…๊ณผ-์ƒ์„ฑ-์›๋ฆฌ 

 

[Spring] ์Šคํ”„๋ง ๋นˆ(Bean)์˜ ๊ฐœ๋…๊ณผ ์ƒ์„ฑ ์›๋ฆฌ

[Spring] ์Šคํ”„๋ง ๋นˆ(Bean)์˜ ๊ฐœ๋…๊ณผ ์ƒ์„ฑ ์›๋ฆฌ ๋นˆ(Bean) Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋นˆ(Bean)์ด๋ผ๋Š” ์šฉ์–ด๋กœ ๋ถ€๋ฅธ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ new ์—ฐ์‚ฐ์ž๋กœ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ๊ทธ ๊ฐ์ฒด๋Š” ๋นˆ์ด ์•„๋‹ˆ

atoz-develop.tistory.com

 

์ถœ์ฒ˜ : https://melonicedlatte.com/2021/07/11/232800.html 

 

์Šคํ”„๋ง ๋นˆ(Spring Bean)์ด๋ž€? ๊ฐœ๋… ์ •๋ฆฌ - Easy is Perfect

 

melonicedlatte.com