티스토리 뷰

Spring Framework

Bean, IoC(Inverstion of Control)

siyoon210 2018. 10. 23. 10:05
반응형

Bean이란 무엇인가?

 Bean을 한마디로 정리하자면, '스프링이 생성하고, 관리해주는 객체' 라고 할 수 있다. (그러므로 개발자가 직접 new연산자로 생성한다면 그것은 Bean이 아니다.)


왜 객체를 Bean으로 해야 할까?

 스프링같은 프레임워크를 다루어 보지 않은 초보 개발자들에겐 자연스러운 궁금증이 생겨난다. 왜 객체를 스프링이 생성하고 관리해야 하는가?

 스프링은 객체를 다루기 위한 보조 기능들을 제공한다. 예를들어 트랜잭션처리, 객체의 라이프사이클 관리, 자동주입 등등... 정확히 어떠한 기능인지는 알 수 없을지 라도 많은 도움을 준다는 것은 알 수 있다. 이러한 기능을 제공받기 위해서 객체를 제어하기 위한 주도권을 스프링에게 넘겨주어야 하고, 그러기 위해서 객체를 Bean으로 생성 하는 것이다. 객체 제어에 대한 주도권이 개발을 하고 있는 '개발자'가 아닌 '스프링'에게 이전(Inversion)되었다고 하여, 이것을 IoC(Inversion of Control)이라고 한다.


객체를 Bean으로 만드는 방법

 객체를 Bean으로 만드는 방법은, 스프링에게 "이 클래스의 객체들은 너가 생성하고 관리해줘!" 라고 말하는 방법이라고 생각하면 된다.


1. 클래스명 위에 @Component 애노테이션을 붙인다. (혹은 이 애노테이션을 포함한, @Controller, @Service, @Repository … )

2. 설정파일을 이용한다.

2-1) XML파일이용

2-2) JAVA Config 파일이용

    설정파일을 이용한 Bean 설정 방법은 다음 포스팅을 참고 ☞ 설정파일을 이용한 간단한 Bean 설정하기

Bean객체를 다룰 때 주의해야 할 사항

 일단, 메모리에 ‘한개만’ 올라가도 되는 객체가 무엇인지 정의해보자. 


1. 필드(인스턴스 변수)가 없다면 그 객체는 여러개 있을 필요가 없다. 

2. 그리고 필드가 있을지라도, 그 필드의 값이 변하지 않는다면, (쓰레드 세이프 하다면) 역시 객체가 여러개 있을 필요가 없다. (setter 프로퍼티가 있다면, 쓰레드 세이프 하지 않을 것이다. 굳이 쓰고 싶다면 Synchronized해야한다.)

3. 여러 쓰레드에서 한 객체를 공통적으로 사용한다고 하더라도, 그 객체의 메소드는 각각 메모리에 올라가기 때문에, 메소드 내부의 지역변수는 쓰레드의 영향을 받지 않는다.

4. 객체의 필드로 쓰레드 세이프한 객체만 있다면, 그 객체도 쓰레드 세이프하다.


 스프링의 Bean객체는 기본적으로 싱글톤 패턴이므로 메모리에 한번만 올라간다.  (하나의 Bean 설정은 하나의 객체를 뜻한다. 만약 같은 클래스라도 Bean설정의 id를 달리 넣어 두번 명시하면, 객체가 2개가 생성된다.) 그러므로, Bean객체가 쓰레드 세이프 하지 않거나, 메모리에 한개 이상 존재 해야 하진 않은지 항상 염두 해야 한다. 

 만약 Bean객체를 싱글톤으로 사용하고 싶지 않다면 Bean의 scope설정을 prototype으로 정의해둔다. (일반적인 Bean객체들은 ApplicationContext가 만들어 질 때 모두 같이 생성되지만, prototype에 경우, 호출 될때마다 만들어진다.) 사실 prototype을 명시하는 방법은 실무에서 자주 쓰이진 않고, 메소드 안에서 new연산자를 사용하여 생성한다. 메소드 안의 지역변수들은 쓰레드로 부터 안전하기 때문이다.

반응형
댓글