전 글에서 DI와 IOC를 이해했다.
그런데 IOC에 들어있는 부품들, 조립 형태를 우리가 주문해야 한다.
그 주문은 XML, 어노테이션으로 하는데 먼저 XML을 통해 주문서를 작성하고 DI를 해보자.
원래의 부품을 만들고 조립하는 방법을 봐보자.
위의 코드를 보면 Exam과 ExamConsole은 인터페이스이다.
Exam을 구현한 NewLecExam은 구현한 클래스로 성적의 합, 평균을 반환해주는 함수를 가지고 있다.
ExamConsole을 구현한 GridExamConsole은 콘솔창에 NewLecExam의 결과를 출력해주는 함수를 가지고 있다.
추가로 InlineExamConsole이라는 ExamConsole을 구현한 클래스가 하나 더 있다.
즉 GridExamConsole는 그리드 방식으로 출력해주고 , InlineExamConsole는 그냥 한 줄에 쭉 출력해주는 방식이다.
우리는 이 두개의 Grid를 사용하거나 Inline방식의 부품을 사용하거나 어쨋든 이 둘을 교체하고 싶은 것이다.
그런데 위에서 보이는 것처럼 Grid에서 Inlined으로, 또는 그 반대로 바꾸려면 코드를 직접 수정해 줘야한다.
console에(console은 Grid 또는 Inline방식 으로 나뉨) exam이라는 부품(dependency)을 주입(injection)한다.
그렇다면 출력 결과는 각각 다음과 같다.
그런데 이런 부품 교체를 스프링이 해준다.
우리는 주문서에 내용을 작성하고 그걸 적용해서 IOC컨테이너에 넣어주고, DI를 해주는 것이다.
메이븐을 사용하여 스프링 프로젝트로 변환하고 xml파일을 주문서로 사용한다.
이처럼 xml파일에 주문을 한다.
6번째 라인:
Exam exam = new NewlecExam()
에 대한 내용을 스프링 형식에 맞추어 주문한 것이다.
<bean></bean> 태그로 감싸고 id는 우리가 만들 객체의 이름. class는 우리가 만들 클래스의 경로까지 적어준다.
9번째 라인:
ExamConsole console = new GridExamConsole();
console.setExam(exam);
에 대한 내용을 주문한다. id는 마찬가지로 console, class도 마찬가지로 리가 만들 클래스의 경로까지 적어준다.
그 안에 property가 있는데 이는 위에서 exam객체가 set을 통해 exam이라는 객체(부품,종속 객체)을 가지기 때문이다.
name = exam은 name=setExam과 같다. setter를 쓸때 맨앞의 set은 없애고 대문자 E를 e로 바꿔줘야 한다.
그리고 ref=exam은 위 라인에서 만든 exam이 참조형이라서 ref로 지정해 줘야한다. (value로 저장하면 안됨!)
이제 주문서를 작성완료했고, 주문서에 따라서 코드도 ioc컨테이너에 명령을 하는 부분을 추가해줘야한다. Program.java의 코드는 아래와 같이 바뀐다.
xml파일의 bean객체를 관리하기 위해서는 ApplicationContext가 필요하다.
해서 위의 코드처러 임포트를 해주고 ApplicationContext을 구현한 ClassPathXmlApplication()에 해당 classPath를 넣어주면 그 곳에 있는 빈 객체들을 만들어준다.
현재 context에 빈 객체들이 들어 있으니
context에서 getBean으로 객체를 꺼내는 것이다.
이렇게 하고 실행을 해보면?
xml에 Grid클래스를 적었기에 grid방식의 출력 결과가 나온다
setting.xml의 9라인을 Inline으로 바꿔서도 실행해보자.
xml을 Inline으로 바꾸니 실행 결과가 달라진 것을 볼 수 있다.
'java spring > DI' 카테고리의 다른 글
DI -4 xml파일을 Configuration클래스로 대체하기 (0) | 2021.04.28 |
---|---|
DI- 3 어노테이션 기반으로 의존성 주입하기 (0) | 2021.04.28 |
DI -1 (0) | 2021.04.26 |