스프링은 자바 프로그램의 제어권을 자신이 갖기 위해(IoC) 자바 객체를 자신만의 형태로 바꾸는데, 그것을 Bean이라고 한다.
즉 스프링 안에서는 "Bean = 객체"라고 생각하면 된다.
이 객체가 Bean으로 등록되는 순간 스프링이 관리하게 되며,
DI라던가 AOP라던가 등 여러가지 이점을 맛볼 수 있다.
Beans와 관련해서 중요한 부분은 BeansFactory가 있다.
- org.springframework.beans.BeanFactory
: beans 패키지의 중심이다. Bean 기능을 제공한다.
(의존성 주입이나 객체를 Bean으로 등록한다던지 등)
해당 인터페이스로 Bean의 각종 설정을 하거나 Bean을 가져올 수 있다.
위에서 말했듯 Bean은 자바 객체와 동일하기 때문에,
구조도 다를 것이 없다. 다만 작성법이 조금 다를 뿐이다.
이러한 작성법은 Bean과 객체를 비교하며 알아보자.
우선 대상이 되는 클래스는 다음과 같다.
/* 자바 클래스 */
class User {
private int id;
private String name;
private String Team;
// 생성자
public User(int id, String name) {
this.id = id;
this.name = name;
}
/* setter/getter 메소드들 */
}
class Team {
/* 여러 설정들 */
}
Class 방식과 XML 방식이 있는데, XML부터 알아보자.
우리가 객체를 생성할 때, 어떤 클래스를 어떤 이름으로 객체화할 것인지를 코딩하였다.
Bean은 이것을 각각class와 id로 설정해준다.
/* 객체 방식 */
// 이름이 teamA인 Team 객체 생성
Team teamA = new Team();
User user = new User();
<!-- xml 방식 -->
// "id가 teamA"이고 "class가 Team"인 객체 생성
<bean id="teamA" class="Team"/>
<bean id="user" class="User"/>
속성을 정의할 때 보통 set을 쓰지만, Bean은 property로 설정한다.
/* 객체 */
// id 속성을 1로 설정
user.setId(1);
user.setName("개발자");
/* Bean 객체 */
<bean id="user" class="User">
// name(id) 속성을 value(1)로 설정
<property name="id" value="1"/>
<property name="name" value="개발자"/>
</bean>
User의 setTeam()은 의존성 주입이다.
이럴땐 value 대신 참조한다는 의미로 ref를 써준다.
/* 객체 */
Team teamA = new Team();
// teamA를 주입
user.setTeam(teamA);
/* Bean 객체 */
<bean id="teamA" class="Team"/>
<bean id="user" class="User">
// name(team) 속성에 ref(teamA)를 주입
<property name="team" ref="teamA"/>
</bean>
이때 주의할 점은 setTeam()에서도 객체 이름인 teamA를 써줬듯이,
Bean의 ref에도 객체 id인 teamA를 써줘야 한다!!
꼭 명심!
ref엔 해당하는 Bean의 id를 적어주자!
또한 각 클래스마다 생성자를 설정해줘야 할 때가 있다.
이럴땐 constructor-arg를 사용한다. 단, 순서대로 설정해야 한다.
나머지는 동일하다.
/* 객체 */
Team teamA = new Team();
// 순서대로 각각 "1, 개발자, teamA"
User user =new User(1, "개발자", teamA);
/* Bean 객체 */
<bean id="teamA" class="Team"/>
<bean id="user" class="User">
// 마찬가지로 순서대로 설정함
<constructor-arg>
<value="1"/>
<value="개발자"/>
<ref="teamA"/>
</bean>
위의 내용을 요약하자면, 다음과 같다.
- Bean을 생성 --> bean id="" class=""
- 속성을 설정 --> property name=""
- 생성자를 설정 --> constructor-arg
- 생성자건 속성이건 값을 설정 --> value=""
- DI를 사용 --> ref=""
이 글을 읽으면 궁금한 점이 있을 수 있다.
이 부분은 굉장히 설명할 것이 많다.
BeanClassLoaderAware로 클래스 로더를 설정하고,
InitializingBean으로 Bean을 초기화하고, DisposableBean으로 Bean을 폐기하고 등등 굉장히 많다.
하지만 여기서 알 필요는 없다.
다음 편에 Context가 등장하는데, 이것은 Bean의 확장 버전이라 Bean의 기능을 포함하고 있다.
때문에 자세히 설명하지 않고 그냥 넘어가는 것이다.
Bean은 어떻게 등록될까? 어떤 원리로 설정되는 거지? 등은 Context 편에서 알아보도록 하겠다.