저번 시간에는 DI 가 뭔지 IOC 가 뭔지에 대해 공부 해봤다. 이번에는 좀 더 깊게 들어가보자.
Spring 이전에 SpringBoot부터 써서 왜 이렇게 써야 하는지 몰랐던 부분을 정리 해봤다.
요즘은 애노테이션을 사용하는 추세이지만 그전에 사용했던 방법, 그리고 왜 이렇게 넘어 왔는지 뭐가 편해졌는지에 대해 학습 하였다.
스프링에서는 DI (의존성 주입) 을 할때 XML을 이용한다.
XML이란 쉽게말해 스프링에게 이러이러한 객체를 만들어 달라는 지시서와 같다.(이전 시간에 학습했던 부품형 객체를 생각하면 된다) 그 지시서를 받은 스프링이 객체를 만들고 IOC 컨테이너에 넣어주는 것이다.
이렇게 객체를 만들고 Setter로 주입을 한다고 생각해보자(setter injection)
이걸 그대로 쓸수 없으니 스프링이 알아듣게 쓰는 지시서가 바로 XML이다.
위에 사진(객체주입) 을 XML로 변경하면 이렇게 된다. 복잡해 보이지만 하나하나 살펴보면 그리 어렵지 않다.
Bean 라는 태그를통해 생성할 객체를 스프링한테 지시해준다.
Bean 을 통해 ioc 컨테이너에 담기면(객체가 만들어 지면) xml에서 쓰인 id값을 이용해 꺼내서 쓸수있다
지시서를 읽은 스프링은 객체를 조립할 무언가가 필요하다. 그것은 바로 ApplicaitonContext
xml bean 지시서를 읽어서 생성해서 조립해주는 스프링 구체적 객체는 applicationContext(인터페이스)
여러 종류가 있다. 지시서를 넘길떄 그녀석의 위치를 어떻게 알려주는지 차이
크게 두가지 방법이 있다.
ioc컨테이너에 담긴 객체를 사용할때 bean 의 id값을 이용해 사용한다
위에 코드처럼 applicationContext (ioc컨테이너 이름).getBean(bean의 id값)
자료형명으로 꺼내기 -> ExamConsole.class => ExamConsole(인터페이스)에 부합하는 클래스가 있으면 찾아줘 하는 방법이 있다.
기존에는 객체코드가 변경되거나 다른 객체를 사용하려 할떄 xml안의 bean 태그 까지가서 코드를 직접 바꿔야 했다.
이 방법이 너무 불편해 객체를 바꾸면 설정도 저절로 바뀌는게 없나 하면서 나온게 바로 애노테이션 방법이다.
애노테이션은 코드에다가 설정을 심어버리는 방법이다.
쉽게 말해 인젝션 해주는 부분이다.
xml에서는 (property 부분 ) -> ioc컨테이너에서 (객체는 생성됫으니) 객체를 찾아서 주입시켜주는 부분
setter or 생성자 or setter가 사용하는 속성위에 선언해준다.
DI 에는 Setter injection 과 생성자 injection 이 있다는걸 잊지말자
하지만 잠깐!
- xml property지우고 오토와이어드만 쓰면 오류가 난다. 스프링이 굳이 객체안에 autowired 애노테이션 찾지는 않으니까 스프링에게 @Autowired 찾아사용하라는 코드를 적어 줘야한다.
자료형을 기준으로 찾는다. (위의 코드에서는 Exam)
그렇다면 자료형이 같은 객체가 두개 이상이면?? 어떻게 구별을 하는가
->@Qualifier
-> id값으로 구별한다!
-> autowired 는 1순위가 자료타입을 기본으로하고 떄로는 식별 모호하면 변수명도 쓴다 = @Qualifier
Autowired는 setter / setter가 사용하는 필드/ 생성자 위에 선언 해준다.
필드위에 생성시 기본생성자가 없으면 오류남
오버로드 생성자까지 없으면 컴파일러가 기본생성자를 생성해서 오류가 없다.
Qualifier 에 대응하는 id 값이 xml에 없을떄, 객체가 없어도 일단 OK
밑에는 null일떄 대응하는 코드를 넣어줘야한다.