본문 바로가기

Spring

스프링부트 / Bean 이해하기

Bean?

Spring 을 공부하면서 빈(Bean) 이라는 말을 참 많이 듣는다.

'bean 으로 등록한다', 'bean 의존성'..등등

 

Spring 에 익숙하지 않은 사람이라면 bean 이라는게 참 낯설고 Spring 을 더 어렵게 만드는 요소일 것이다.

오늘은 그 '빈' 이라는 것을 조금이나마 이해해보는 시간을 가져보자.

 

Spring Container

먼저 bean 을 이해하기 위해서 스프링 컨테이너(Spring Container 또는 Ioc 컨테이너라고 하기도 한다) 에 대해서 알아둘 필요가 있다.

자바 에플리케이션은 에플리케이션 동작을 제공하는 객체들로 이루어져있다.

이때, 객체들은 독립적으로 동작하는 것보다 서로 상호작용하여 동작하는 경우가 많다.

이렇게 상호작용하는 객체를 '객체의 의존성'이라고 표현한다.

 

스프링에서는 스프링 컨테이너가 객체들을 생성하고 객체끼리 의존성을 주입하는 역할한다.

그리고, 스프링 컨테이너가 생성한 객체들을 '빈'이라고 한다.

즉, 빈은 스프링에서 사용하는 어플리케이션 객체라고 이해할 수 있다.

 

빈은 어떻게 생성될까?

그렇다면 어떻게 빈이 생성될까? 다시말하면 스프링은 어떻게, 어떤 기준으로 객체를 생성할까?

빈을 생성하는 방법으로는 두가지가 있다.

 

빈 생성 방법1. - xml 활용

첫번째 방법은 xml 파일을 이용하는 것이다.

스프링이 컴파일단계에서 스캔하는 xml 에 파일에 bean 을 명시적으로 입력해주는 방법이다.

 

간단하게 xml 로 빈이 생성되는것을 확인해보자

프로젝트 구조와 SayHello 클래스는 왼쪽과 같다.

 

 

 

아래는 SayHello 클래스의 구현이 나와있는데,

SayHello 객체가 생성될때 "SayHello 생성자 호출" 이라는 문구가 출력될 것이다.

 

 

 

 

 

 

 

package study.oc.base;

public class SayHello {
	public SayHello() {
		System.out.println("SayHello 생성자 호출");
	}
}

 

그리고 main > resources > application.xml 의 경로로 application.xml 파일을 다음과 같이 만들어주자.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="sayHello" class="study.oc.base.SayHello"/>
</beans>

위에보이는 application.xml 을 Spring 이 읽어들여 그 안에 명시된 대로 bean을 생성하게 된다. 

 

이제 실행을 해보자.

package study.oc.base;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

 

하지만 어쩐지 에러가 발생하는 모습이다.

정확한 원인은 모르겠으나 예상하기로는 springboot 가 처음 동작할때 application.xml 의 경로를 못 읽어 들이는것 같다...

아쉬운대로 다른 방법으로 확인해 볼 수 밖에 없다.

Application 클래스 파일을 다음과 같이 수정하고 실행해보았다.

package study.oc.base;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
	}
}

 

실행결과

빈이 잘 생성되는 모습이다.

 

 

빈 생성 방법2. - 어노테이션 활용

xml 을 통해서 빈을 생성하는 것은 상당히 번거로운 일이다.

SpringBoot 에서는 어노테이션 을 활용하여 편리하게 빈을 생성할 수 있다.

많은 어노테이션이 있지만 이글에서는 @Component 라는 어노테이션을 지정해보려고 한다.

@Compenent 는 스프링 컴포넌트 클래스를 지정하는 어노테이션이라는 것만 알고 넘어가자.(@Component 에 대한 자세한 설명은 생략)

package study.oc.base;

import org.springframework.stereotype.Component;

@Component
public class SayHello {
	public SayHello() {
		System.out.println("SayHello 생성자 호출");
	}
}

 

Main

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

 

실행결과

 

컴파일 단계에서 "SayHello 생성자 호출" 이 잘 출력되는 모습을 확인할 수 있었다.

 

 

현재는 xml 을 이용하여 빈을 관리하는 방법보다는 대부분 어노테이션을 이용하여 빈을 관리한다.

어노테이션 하나 다는 것만으로 빈이 관리되다보니 spring 을 처음 접하는 사람들에게는 빈이라는 것이 굉장히 추상적으로 느껴질 수 있다.

하지만 컴파일 과정에서 빈으로 등록한 객체가 호출되는 것을 눈으로 확인하니 조금은 구체화된 느낌이다.

 

 

반응형