thumbnail thumbnail

2024-04-11 Bean 등록 (토비의 스프링)

포스트

우선 이전에 있던 연구를 참조하고 오기 바란다.

Bean 등록이란

지금껏 xml 문서에 일일히 Bean 선언을 적어주어야만 했던 Spring 레거시 프로젝트 들은 매우 귀찮은 작업이었다. App이 커지고 Bean 의 수가 많아질수록 xml 문서의 관리도 번거로워졌다. xml 문서와 같이 한 곳에 전부 선언하지 않더라도 Spring Bean 등록을 하는 방법이 있다. Bean 으로 사용될 클래스에 ‘특별한’ 어노테이션을 부여 해주면 이러한 Bean 을 자동으로 찾아 등록해주는 방식을 BeanScanner 라고 한다. 이 자동 Bean 등록을 담당하는 객체가 바로 “BeanScanner” 이다.

 

BeanScanner

스프링의 BeanScanner 는 지정된 클래스 path (경로) 아래에 있는 모든 패키지의 클래스를 대상으로 필터를 적용 시켜 Bean 등록을 위한 클래스들을 선별해낸다. “BeanScanner” 에 내장된 디폴트 필터는 @Component 어노테이션을 가졌거나, @Component 어노테이션이 직접 부여된 어노테이션을 가진 클래스를 선택하도록 되어있다. 이를 통해서 @Component 가 붙혀 졌다면 손쉽게 Bean 등록이 가능하다. 이런 @Component@Component 를 포함한 어노테이션을 “스테레오 타입 어노테이션” 이라고 한다.

 

Bean 등록 과정

@Component 가 선언된 클래스는 Bean 으로 등록되어 사용해지게 된다. 하나의 Bean 이 등록되기 위해서는 xml 문서에 class 이름과 id 가 최소한의 메타 정보로서 존재해야 한다. 그렇다면 @Component 선언된 클래스는 어떻게 이름과 id 를 만드는 것일까?

클래스 이름은 어노테이션의 아랫 줄에 위치해 검색이 어렵지 않다. 그렇다면 id 는 어떨까? BeanScanner 는 기본적으로 클래스의 이름을 id 로 사용한다. 더욱 정확하게는 클래스 이름의 첫 글자 만을 소문자로 바꾸어 사용하고 등록하게 된다.

[ 예시 : AddTaskCommand = 이름 , addTaskCommand = id ]

Java
@Test public void simpleBeanScanner(){ ApplicationContext ctx = new AnnotationConfigApplicationContext( "springbook.learningtest.sprin.ioc.bean"); AddTaskCommand addCommand = ctx.getBean( "addTaskCommand", AddTaskCommand.class); assertThat(addCommand, is(notNullValue())); }

 

xml 문서 파일의 태그는 한 줄도 작성하지 않고 Bean 등록이 되었다. 복잡한 xml 문서 생성과 관리에 따른 수고를 덜어주고 개발 속도를 향상 시키는게 가능하다. 물론 xml 문서를 다룰 때와 달리 Bean이 정의 되는지를 한눈에 보기에는 어렵다.

 

그래서인지 개발 단계에서는 @Component 와 같은 어노테이션을 사용하여 bean 등록을 수행하고 고도화 해서 발전하게 되면, 보수, 관리 단계에서 xml 문서 파일로 바꾸어 관리하기도 한다. 특히 코드를 넘겨주는 과정이나 다른 팀에 양도하는 과정에서는 Bean 의 xml 문서가 따로 선언 되어있어야 인수인계에 용이하기에 이러한 과정을 담는 경우도 있다.

 


java 코드에 의한 Bean 등록 : @Configuration 클래스 , @Bean 메소드