Spring Bean ์ด๋?
๐ ๋ชฉ์ฐจ
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