본문 바로가기

개발중/Spring

[Spring] Spring Bean 에 대한 기록

728x90
반응형
SpringBean ? Spring 을 말할 때 빼먹을 수 없는 용어이다.

 

Spring Bean

스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈이라고 칭한다. 

또한, 스프링 컨테이너가 생성과 관계설정, 사용들을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.

 

면접용 질문에 대한 답으로는 아래와 같이 명확한 답이 준비되어있다. 

'스프링 빈은 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다.'

 

Spring Container

스프링 컨테이너는 스프링 빈의 생명 주기를 관리하며, 생성된 스프링 빈들에게 추가적인 기능을 제공하는 역할을 한다. IoC와 DI의 원리가 스프링 컨테이너에 적용된다.

 

개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만,

스프링 컨테이너를 사용하면 해당 역할을 대신해 준다.

즉, 제어 흐름을 외부에서 관리하게 된다.

 

또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다.

  • IOC 제어의 역전
    • 제어의 역전이란, 간단히 말해서 객체의 생성 및 제어권을 사용자가 아닌 스프링에게 맡기는 것이다. 지금까지는 사용자가 new연산을 통해 객체를 생성하고 메소드를 호출했다. IoC가 적용된 경우에는 이러한 객체의 생성과 사용자의 제어권을 스프링에게 넘긴다. 사용자는 직접 new를 이용해 생성한 객체를 사용하지 않고, 스프링에 의하여 관리당하는 자바 객체를 사용한다. 이 객체를 '빈(bean)'이라 한다.

Spring Bean 등록 방법

@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다. 

@Component를 포함하는 @Controller, @Service, @Repository 애노테이션도 스프링 빈으로 자동 등록된다.

 

Spring Bean 의존성 주입 방법

@Autowired 을 사용하면 된다.

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다. 

이렇게 객체 의존관계를 외부에서 넣어주는 것을 '의존성 주입(DI)'라 한다. 

 

Spring Bean 생명주기

스프링의 IoC 컨테이너는 Bean 객체들을 책임지고 의존성을 관리한다.

객체들을 관리한다는 것은 객체의 생성부터 소멸까지의 생명주기(LifeCycle) 관리를 개발자가 아닌 컨테이너가 대신 해준다는 말이다.
객체 관리의 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있다.

 

 

설정 정보에 초기화 메소드, 종료 메소드 지정

  • 이 방식의 장점
    • 메소드명을 자유롭게 부여 가능하다.
    • 스프링 코드에 의존하지 않는다.
    • 설정 정보를 사용하기 때문에 코드를 커스터마이징 할 수 없는 외부라이브러리에서도 적용 가능하다.
  • 이 방식의 단점
    • Bean 지정시 initMethod와 destoryMethod를 직접 지정해야 하기에 번거롭다.
public class ExampleBean {
 
    public void initialize() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    public void close() throws Exception {
        // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
    }
}
 
@Configuration
class LifeCycleConfig {
 
    @Bean(initMethod = "initialize", destroyMethod = "close")
    public ExampleBean exampleBean() {
        // 생략
    }
}

 

PostConstruct, @PreDestory 어노테이션

  • 이 방식의 장점
    • 최신 스프링에서 가장 권장하는 방법이다.
    • 어노테이션 하나만 붙이면 되므로 매우 편리하다.
    • 패키지가 javax.annotation.xxx 이다. 스프링에 종속적인 기술이 아닌 JSR-250이라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.
    • 컴포넌트 스캔과 잘어울린다.
  • 이 방식의 단점
    • 커스터마이징이 불가능한 외부 라이브러리에서 적용이 불가능하다.
    • 외부 라이브러리에서 초기화, 종료를 해야 할 경우 두 번째 방법 즉, @Bean의 initMethod와 destoryMethod 속성을 사용하자.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
 
public class ExampleBean {
 
    @PostConstruct
    public void initialize() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    @PreDestroy
    public void close() throws Exception {
        // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
    }
}

 

 

728x90
반응형