티스토리 뷰
1. 빈(Bean)
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다. 우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다. ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다. 즉 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
주요 속성
- class(필수): 정규화된 자바 클래스 이름
- id: bean의 고유 식별자
- scope: 객체의 범위 (sigleton, prototype)
- constructor-arg: 생성 시 생성자에 전달할 인수
- property: 생성 시 bean setter에 전달할 인수
- init method와 destroy method
오늘은 DI의 xml 방식에 대해 설명하겠다.
xml에서 Bean 객체 정의
<bean id="console" class="spring.di.ui.InlineExamConsole" />
ApplicationContext context =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ExamConsole console1 = context.getBean(ExamConsole.class);
ExamConsole console2 = (ExamConsole) context.getBean("console");
console1.print();
코드에서 xml 파일의 정보를 ClassPathXmlApplicationContext함수에 설정파일을 인자로 넣어 가져온다.
getBean()을 통해 bean의 주소값을 가져온다.
인자로 클래스(or 인터페이스 클래스)를 넣거나 bean의 id를 전달하여 가져온다.
해당 객체의 함수를 호출할 수 있는 것을 보아 객체를 잘 가져왔음을 알 수 있다.
2. DI (Dependency Injection) : 의존성 주입
public class NewlecExam(){
private Exam exam;
public void setExam(Exam exam) {
this.exam = exam;
}
}
위 코드는 현재 객체가 다른 객체와 상호작용(참조)하고 있기 때문에 객체 의존성을 가진다.
이러한 객체 의존성은 하나의 모듈이 바뀌면 의존하고 있는 다른 모듈까지 모두 바꾸어야 하는 불편함을 초래한다.
그래서 코드 자체에서가 아니라 프레임워크에 의해 의존성을 주입시켜주는 설계 패턴을 DI라고 한다.
이는 높은 재사용성과 가독성이 있는 코드를 만들어낸다.
IOC (Inversion Of Control) : 제어의 역전
프로그램 제어권을 프레임워크가 가져가는 것이다.
개발자가 모든 제어의 중심이지만 코드 전체에 대한 제어는 프레임워크가 한다.
개발자가 설정(xml, annotation 등)만 하면 Container가 알아서 처리한다.
의존성 주입 방법 (xml)
- Contructor Injection : 생성자를 통한 전달
- 태그를 사용하는 방법.
<bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="20"/>
<constructor-arg name="com" value="30"/>
</bean>
- 또는 위의 방법이 아닌 단일 태그로 인자를 전달할 수 있다.
위의 beans에 설정 파일 처리기를 추가한다. (namespace)
xmlns:p="[http://www.springframework.org/schema/p](http://www.springframework.org/schema/p)"bean
태그 안에서 다음과 같이 생성자의 인자를 전달할 수 있다.
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20" p:com="30"/>
2. Method(Setter) Injection : setter()을 통한 전달
<bean id="console" class="spring.di.ui.InlineExamConsole" />
<property name="exam" ref="exam"/>
</bean>
Property 속성의 name=”exam”이라면 이는 setExam() 함수를 뜻한다.
전달해 줄 인자는 value나 ref를 통해 설정한다.
3. Field Injection : 멤버 변수를 통한 전달
Collection 생성과 목록 DI
자바의 Collection을 사용할 때 원래 다음과 같이 사용한다.
List<Exam> exams = new ArrayList<>(new NewlecExam(1,1,1));
콜렉션 또한 위의 방법이 아닌 xml에서 DI를 하도록 설정할 수 있다.
- 태그 이용하는 방법
<bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.NewlecExam" p:com="20" p:eng="40" p:kor="60"/>
<ref bean="exam"/>
</list>
</constructor-arg>
</bean>
- namespace를 추가하여 이용
xmlns:util="[http://www.springframework.org/schema/util](http://www.springframework.org/schema/util)"
<util:list id="exams" >
<bean class="spring.di.entity.NewlecExam" p:kor="20" p:eng="40" p:com="60"/>
<ref bean="exam"/>
</util:list>
getBean() 함수로 해당 콜렉션을 가져와 사용할 수 있다.
List<Exam> exams = (List<Exam>) context.getBean("exams");
exams.add(new NewlecExam(1,1,1));
'백엔드 및 서버' 카테고리의 다른 글
[ Spring ] AOP 설명 및 구현방식(xml) (0) | 2021.01.23 |
---|---|
[ Spring ] DI (Dependency Injection) Annotation 방식 설명 및 사용법 (0) | 2021.01.22 |
[ JSP / Servlet ] MVC 패턴이란? (0) | 2020.12.04 |
[ JSP / Servlet ] Filter 사용하기 (0) | 2020.12.02 |
[ JSP / Servlet ] GET, POST 방식 전송 (0) | 2020.12.02 |