토비의 스프링 Vol2 1.4 기타 빈 설정 메타정보

Soonwoo Kwon·2022년 6월 6일
0

토비의 스프링

목록 보기
10/11

1.4 기타 빈 설정 메타정보

1.4.1 빈 이름

지금까지 빈 아이디와 빈 이름을 통해 특정 빈을 구분하여 사용하였고 이는 빈 식별자(identifer) 라고 한다.
XML의 경우 <bean> 태그의 id와 name 두 가지 attribute를 이용해 식별자를 정의한다.

  • id
    • 공백이 불가능하다.
    • 첫글자는 알파벳, 밑줄 등 몇몇 문자만 가능하다.
    • 관례적으로 id에 사용하는 값은 빈을 대표하는 타입 이름을 첫 글자만 소문자로 바꿔 사용한다.
    • id는 생략이 가능하며 빈 선언에 어떠한 식별자도 부여하지 않는다면 스프링 컨테이너가 자동으로 빈의 아이디를 부여한다.
  • name
    • id와 달리 특별한 제약이 없다.
    • ,이나 ;를 이용해 하나 이상의 빈 이름을 구분하여 부여할 수 있다.

애노테이션에서의 빈 이름

클래에서 @Component와 같은 스테레오타입의 애노테이션을 부여해주면 클래스의 이름을 그대로 빈 이름으로 사용하는 방법을 선호한다.

다음과 같이 정의된 클래스를 빈 스캐너로 자동등록하면 빈의 이름은 userService가 된다.

@Component
public class UserService{
}

애노테이션 안에 이름을 등록하는 방법도 가능하다.

@Component("myUserService")
public class UserService{
}

자바 코드를 이용한 빈 등록 방식에서는 @Bean 애노테이션의 name 엘리먼트를 사용한다.

@Configuration
public class Config {
	@Bean(name="myUserDao", "userDao"})
    public UserDao userDao(){

1.4.2 빈 생명주기 메소드

초기화 메소드(initialization method)

초기화 메소드는 빈 오브젝트가 생성되고 DI된 이후에 실행되는 메소드이다.

초기화 롤백 인터페이스

InitailizingBean 인터페이스를 구현하여 빈을 작성할 수 있다. 인터페이스의 afterProperties() 메소드는 프로퍼티 설정이 끝나면 호출된다.
사용이 간단하지만 애플리케이션 코드에 스프링 인터페이스가 노출된다는 단점이 있다.

init-method 지정

XML을 이용할 경우 태그의 init-method 애트리뷰트를 사용하여 초기화 메소드를 지정할 수 있다.

<bean id="myBean" class="MyBean" init-method="initResource"/>

빈 클래스에 스프링 API가 노출되지 않아 깔끔하다. 하지만 XML 설정 참조 없이는 초기화 메소드가 호출된 것인지 알 수 없다.

@PostConstruct

초기화 메소드로 사용될 메소드에 @PostConstruct 애노테이션을 부여한다.
init-method를 설정보다 직관적이며 가장 구너장되는 방식이다.

@Bean(init-method)

@Bean 애노테이션의 init-method 엘리먼트를 사용하여 초기화 메소드를 지정한다.

제거 메소드(destrution method)

컨테이너가 종료될 때 호출되어 빈이 사용한 리소스를 반환하거나 종료 전에 처리할 작업을 수행한다.

제거 콜백 인터페이스

DisposableBean 인터페이스를 구현하여 destroy() 메소드를 구현한다.

destroy-method

태그에 destroy-method 애트리뷰트를 넣어 제거 메소드를 지정한다.

@PreDestroy

애노테이션을 통해 제거 메소드를 지정한다.

@Bean(destroyMethod)

desrtoyMethod 엘리먼트를 이용하여 제거 메소드를 지정한다.

1.4.3 팩토리 빈과 팩토리 메소드

팩토리 빈은 생성자 대신 오브젝트를 생성해주는 코드의 도움을 받아서 빈 오브젝트를 생성한다. 빈 팩토리와는 다른 개념이다.
팩토리 빈은 빈 오브젝트로 사용되지 않는다. 팩토리 기능을 가진 빈을 통째로 사용하는 방법도 있지만, 특정 빈이나 클래스의 팩토리 메소드를 사용해서 빈을 등로가는 방법도 있다.

FactoryBean 인터페이스

new 키워드나 리플렉션 API를 이용한 생성자 호출로 만들 수 없는 JDK 다이내믹 프록시를 빈으로 등록하기 위해 사용되었다.
FactoryBean 인터페이스를 구현하고 다이내믹 프록시를 생성하는 getObject() 메소드를 구현하여 팩토리 빈으로 등록해 사용한다.
가장 단순하고 가장 자주 사용되는 방법이다.

스태틱 팩토리 메소드

클래스의 스태택 팩토리 메소드를 호출하여 인스턴스를 생성한다. JDK를 비롯한 다향한 기술 API에서 사용된다.
태그의 factory-method 애트리뷰트로 메소드를 지정한다.

인스턴스 팩토리 메소드

스태틱 메소드가 아닌 오브젝트의 인스턴스 메소드를 이용해 빈 오브젝트를 생성한다. FactoryBean 인터페이스를 구현한 방식과 같지만 FactoryBean 이라는 스프링 인터페이스에 종속되지 않는다는 장점이 있다.
임의의 오브젝트의 메소드를 호출하여 빈을 생성한다면 팩토리 기능을 제공할 빈을 따로 등록해야 한다.

@Bean 메소드

스프링 컨테이너가 @Bean 메소드를 실행해 빈 오브젝트를 가져온다. 자바 코드에 의해 빈 설정과 DI를 적용한다면 @Configuration이 붙은 설정 전용 클래스를 사용한다. 반면 특정 빈만 팩토리 메소드를 통해 만든다면 일반 빈 클래스에 @Bean 메소드를 추가한다.

0개의 댓글