백엔드 개발 공부 일지
Java Spring - Spring IOC 본문
● Spring IOC
"Spring IOC" 는프로그램에서 필요한 객체 생성을 Spring FW에서 하고 객체를 필요로 하는 곳에 주입하는 것 그리고 객체를 찾을 떄 제공하는 것 모두 Spring FW 대신 처리한다.
Spring FW에 의해 관리되는 Java 객체를 bean이라고 부르며 이 일을 담당하는 Spring FW의 구성요소를 IOC 컨테이너라고 한다.
Spring DI는 객체간의 결합도를 느슨하게 하는 스프링의 핵심 기술이다.
- Spring IOC 컨테이너 초기화
ApplicationContext context = new ClassPathXmlApplicationContext("빈 설정 파일");
- DL (Dependency Lookup)의 예
타입명 bean = (타입명)context.getBean("빈이름");
- DI (Dependency Injection)의 예
1. Construction Injection : 생성자를 통해서 객체 파인딩 (의존관계 연결)
2. Setter Injection : setter메서드를 이용해서 객체 바인딩 (의존관계 연결)
● IOC 설정
1) XML 설정 (Bean 설정 파일)
많은 프레임워크의 라이브러리가 XML 스키마를 이용한 설정의 편리함을 지원한다.
프로젝트의 규모에 따라 XML 문서의 내용이 많아지게 된다.
코드를 실행해야 설정 정보의 오류를 확인할 수 있다.
<!-- Sample2 -->
<?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="foo0" class="sample2.Foo" /> <!-- prototyp/sigleton(default) scope="prototype"-->
<bean id="foo1" class="sample2.Foo">
<constructor-arg value="XYZ"/>
</bean>
<bean id="foo2" class="sample2.Foo">
<constructor-arg value="ABC"/>
<constructor-arg value="100"/>
</bean>
<bean id="foo3" class="sample2.Foo">
<constructor-arg index="1" type="int" value="50"/>
<constructor-arg index="0" type="java.lang.String" value="xyz"/>
<constructor-arg index="2" type="boolean" value="true"/>
</bean>
<bean id="foo4" class="sample2.Foo">
<constructor-arg ref="bar" />
</bean>
<bean id="bar" class="sample2.Bar" />
</beans>
Foo 객체 생성-no arsg
-----------------------
Foo 객체 생성-XYZ
-----------------------
Foo 객체 생성-ABC 100
-----------------------
Foo 객체 생성-xyz 50 true
-----------------------
Bar 객체 생성
Foo 객체 생성-sample2.Bar@2038ae61
-----------------------
************ IoC 컨테이너의 초기화 작업 끝 ************
Scope(singleton/prototype)
sample2.Foo@50b494a6
sample2.Foo@50b494a6
sample2.Foo@50b494a6
2) Annotaion 설정
소스 안의 정해진 Annotaion 들을 사용한다.
(1) @Component
클래스에서 선언하며 해당 클래스를 bean으로 등록한다.
bean의 이름은 해당 클래스명(첫 글자는 소문자로 변경해서) 사용한다.
범위는 디폴트로 singleton이며 @Scope을 사용하여 지정할 수 있다.
소스안에 작성된 애노테이션이 적용되려면 다음과 같은 태그들이 설정파일에 정의 되어 있어야 한다.
<context:annotation-config> - @Autowired 만 사용했을 때
<context:component-scan base-package="xxx"/> - 모든 에노테이션 (보통 얘를 사용한다.)
(2) @Scope
스프링은 기본적으로 빈의 범위를 "sigleton"으로 설정한다. "singleton"이 아닌 다른 범위를 지정하고 싶다면 @Scope 애노테이션을 이용하여 범위를 지정한다.
설정 : prototype, singleton, request, session, globalsession
ex)
(3) @Autowired
오터 와이어링 애노테이션은 Spring에서 "의존관계"를 자동으로 설정할 때 사용된다. 이 애노테이션은 생성자, 필드, 메서드 세곳에 적용이 가능하며, 타입을 이용한 프로퍼티 자동 설정 기능을 제공한다.
즉, 해당 타입의 빈 객체가 없으면 예외를 발생시킨다. (만족하는게 없을시 빈 객체로 의존관계를 설정해야하므로??)
프로퍼티 설정 메서트(ex: setXXX()) 형식이 아닌 일반 메서드에도 적용 가능하다. 프로퍼티 설정이 필수가 아닌 경우 @Autowired(required = false)로 선언한다. (기본값은 true) byType으로 의존관계를 설정할 경우 같은 타입의 빈이 2개이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다.
이럴 때는 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.
(4) @Qualifier
@Autowired 애노테이션과 함께 사용된다. 빈이 타입이 아닌 이름으로 주입하려는 경우 사용된다.
(5) @Resource (Autowired + Qualifier)
자바6 버전 및 JEE 5 버전에 추가된 것으로 어플리케이션에서 필요로 하는 자원을 자동 연결할 떄 사용한다. 스프링 2.5부터 지원하는 애노테이션으로 스프링에서는 의존하는 빈 객체를 전달할 떄 사용한다.
@Autowired 와 동일한 기능이며 @Autowired 와의 차이점은 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결시켜준다는 것이다. 설정 파일에서 <context:annotation-config> 태그를 사용해야 인식하며 name 속성에 자동으로 연결된 빈 객체의 이름을 입력한다.
ex) @Resuorce(name="testDao")
'Java Spring' 카테고리의 다른 글
JAVA Spring - JPA (0) | 2023.02.03 |
---|---|
JAVA Spring - MyBatis (0) | 2023.01.19 |
Java Spring - MVC (0) | 2023.01.16 |
JAV WEB - Servelt & JSP (2) (0) | 2022.12.30 |
JAV WEB - Servelt & JSP (1) (0) | 2022.12.28 |