빈(bean) 객체 스코프(scope)
기본적으로 컨테이너에 한 개의 bean 객체를 생성해 재사용한다.
bean의 scope를 설정할 수 있는 방법을 제공한다.
방식 | 설명 |
singleton | 컨테이너에 한 개의 bean 객체만 생성한다.(기본값) |
prototype | bean을 요청할 때마다 bean 객체를 생성한다. |
request | HTTP 요청마다 bean 객체를 생성한다.(WebApplicationContext에서만 적용) |
session | HTTP 세션마다 bean 객체를 생성한다.(WebApplicationContext에서만 적용) |
global-session | 글로벌 HTTP 세션에 대한 bean 객체를 생성한다. 포틀릿을 지원하는 컨텍스트에만 적용 가능하다. |
scope를 prototype으로 설정한 stu1의 stu1, stu2는 각각 새로운 객체를 생성했으므로 false,
singletone으로 설정한 stu2의 stu3, stu4와
scope 설정을 하지 않은 scopeTest의 stu5, stu6은 하나의 객체를 공유하므로 true가 출력된다.(기본값 singletone)
Bean에 접근하는 방법 3가지
// create bean
ApplicationContext ctx = new ClassPathXmlApplicationContext("echo.xml");
EchoBean echoRef1 = ctx.getBean(EchoBean.class);
EchoBean echoRef2 = (EchoBean)ctx.getBean("echoBean");
EchoBean echoRef3 = ctx.getBean("echoBean", EchoBean.class);
Annotation 기반 bean 설정 방법
Spring 2.5부터 지원되는 빈 설정 방법으로 JAVA의 annotation을 사용할 수 있다.
Java 코드에 설정된 annotation을 활성화시키기 위해서는 XML 파일 설정이 필요하다.
<context:annotation-config/> 태그를 작성해 줘야 한다.
@Required
org.springframework.beans.factory.annotation.Required
setter 메소드에 설정해 주면 bean 생성 시 필수 속성임을 알려 준다.
영향을 받는 bean property 구성 시 xml 설정 파일에 반드시 property를 채워야 한다.
그렇지 않으면 BeanInitializationException 예외가 발생한다.
@Autowired
org.springframework.beans.factory.annotation.Autowired
속성 또는 생성자, setter 메소드에 설정한다.
필수 속성(required=false로 필수 속성 해제 가능)
Type을 먼저 확인한 후 못 찾으면 byName으로 주입한다. → Qualifier와 함께 사용 시 byName으로 강제된다.
autowire="byType"과 동일한 기능
배열, collection 모두 설정 가능하다.
autowired할 클래스에 @Autowired annotation을 작성한다.(import 확인)
@Qualifier
같은 타입의 bean이 2개 이상 존재하는 경우 스프링 컨테이너 초기화 과정에서 예외가 발생한다.
이러한 경우 @Qualifier를 @Autowired와 같이 사용해, 같은 타입의 bean 객체 중 해당 id값을 가진 bean이 주입될 수 있도록 한다.(byName)
메소드의 파라미터에 적용 가능하다.
@Resource
javax.annotation.Resource
autowire="byName"과 동일한 기능(bean의 id값과 일치하는 객체 주입)
속성, 생성자, 메소드 지정
name 속성을 사용한다.
@Autowired+ @Qualifier와 기능이 같다.
Annotation 사용으로 인해 특정 Framework에 종속적인 application을 구성하지 않기 위해서는 @Resource 사용을 권장한다.
사용하기 위해서는 class path 내에 jsr250-api.jar 파일을 추가해야 한다.
@Value("${설정변수}")
특정 값을 주입하는 용도로 사용한다.(초기값 설정)
대표적인 용도는 Java 코드 외부의 리소스나 환경정보 설정값을 사용할 때이다.
객체를 가져와서 초기값으로 설정하는 것도 가능하다.
- SpEL을 이용한 방법 - @Value(#{systemProperties['priority'] ?: 'some default'})
property를 설정할 필요가 없기 때문에 .xml에는 bean 객체를 생성하는 코드만 작성한다.
component-scan(bean 객체 스캔)
XML 설정 파일에 <context:component-scan> 태그의 base-package 속성으로 지정된 패키지 내의 클래스를 검색해,
다음 annotation이 있는 클래스에 대해서 자동으로 bean 인스턴스를 생성한다.
@Component, @Service, @Repository, @Controller, @Configuration, @Named
XML 설정 파일에 여러 bean 정보를 명시적으로 추가하지 않고 자동으로 bean들을 등록한다.
(bean의 이름은 첫 글자가 소문자인 클래스명으로 지정된다.)
@Component
@Scope(' ')으로 scope 지정이 가능하다.
com.service 패키지를 스캔해 어노테이션이 있는 클래스들을 찾아,
id가 클래스 이름(가장 앞글자 소문자)인 bean을 자동 생성해 준다.
@Service, @Repository, @Controller
해당 클래스가 Controller/Service/Repository로 사용됨을 Spring Framework에 알린다.
일반적으로 DB에 접근하는 DAO는 @Repository, Service는 @Service를 사용한다.
@Named
@Autowired의 @Qualifier처럼 사용할 수 있는 것이 @Inject에서는 @Named이다.
@Qualifier와 달리 XML 설정파일에 다른 정보를 명시할 필요 없이 기존의 bean객체의 id로 객체를 선택한다.
@Inject
@Autowired와 유사하게, 주입하려고 하는 객체의 타입과 일치하는 객체를 자동으로 주입한다.
@Resource는 Java 제공 annotation이며 필드, 생성자, Setter에 붙일 수 있다.
필드, Setter에 사용할 경우 반드시 기본 생성자가 정의되어 있어야 한다.
@Configuration
@Bean을 사용하는 클래스에는 반드시 @Configuration을 붙여 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다.
즉, @Bean을 사용하는 클래스의 경우 반드시 @Configuration과 함께 사용해주어야 한다.
@Bean은 개발자가 직접 제어가 불가능한 라이브러리를 활용하거나, 초기 설정을 할 때 주로 사용한다.
@Configuration없이 @Bean만 사용해도 bean으로 등록이 된다.
하지만 메소드 호출을 통해 객체를 생성할 때 singletone을 보장하지 못하므로, Spring 설정 정보를 위해 반드시 @Configuration을 사용해 주어야 한다.
참고한 글
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] property 설정, autowire (0) | 2020.12.14 |
---|---|
[Spring] Dependency Injection(Constructor/Setter-based Injection) (2) | 2020.12.13 |
[Spring] Spring Framework의 개요 (0) | 2020.12.13 |
[Spring] return "redirect:/주소"와 return "view" (0) | 2020.11.16 |
댓글