스프링 -DI/XML/@Autowired/@Qualifier

Shaun·2021년 10월 14일
1

스프링

목록 보기
1/6

학습목표

  • 저번 시간에는 DI 가 뭔지 IOC 가 뭔지에 대해 공부 해봤다. 이번에는 좀 더 깊게 들어가보자.

  • Spring 이전에 SpringBoot부터 써서 왜 이렇게 써야 하는지 몰랐던 부분을 정리 해봤다.

  • 요즘은 애노테이션을 사용하는 추세이지만 그전에 사용했던 방법, 그리고 왜 이렇게 넘어 왔는지 뭐가 편해졌는지에 대해 학습 하였다.

스프링 XML

  • 스프링에서는 DI (의존성 주입) 을 할때 XML을 이용한다.

  • XML이란 쉽게말해 스프링에게 이러이러한 객체를 만들어 달라는 지시서와 같다.(이전 시간에 학습했던 부품형 객체를 생각하면 된다) 그 지시서를 받은 스프링이 객체를 만들고 IOC 컨테이너에 넣어주는 것이다.

  • 이렇게 객체를 만들고 Setter로 주입을 한다고 생각해보자(setter injection)

  • 이걸 그대로 쓸수 없으니 스프링이 알아듣게 쓰는 지시서가 바로 XML이다.

  • 위에 사진(객체주입) 을 XML로 변경하면 이렇게 된다. 복잡해 보이지만 하나하나 살펴보면 그리 어렵지 않다.

  • Bean 라는 태그를통해 생성할 객체를 스프링한테 지시해준다.

  • Bean 을 통해 ioc 컨테이너에 담기면(객체가 만들어 지면) xml에서 쓰인 id값을 이용해 꺼내서 쓸수있다

  • 지시서를 읽은 스프링은 객체를 조립할 무언가가 필요하다. 그것은 바로 ApplicaitonContext

ApplicaitonContext(스프링 객체 조립도구)

  • xml bean 지시서를 읽어서 생성해서 조립해주는 스프링 구체적 객체는 applicationContext(인터페이스)

  • 여러 종류가 있다. 지시서를 넘길떄 그녀석의 위치를 어떻게 알려주는지 차이

  • applicationContext 를 사용하는 방법이다.() 안에 xml 의 위치를 넣어주면 모든 준비는 끝난다. 스프링이 객체를 생성해 ioc컨테이너에 담아준다.

IOC객체에서 꺼내서 사용하기

  • 크게 두가지 방법이 있다.

  • ioc컨테이너에 담긴 객체를 사용할때 bean 의 id값을 이용해 사용한다

  • 위에 코드처럼 applicationContext (ioc컨테이너 이름).getBean(bean의 id값)

  • 자료형명으로 꺼내기 -> ExamConsole.class => ExamConsole(인터페이스)에 부합하는 클래스가 있으면 찾아줘 하는 방법이 있다.

XML대신 애노테이션 사용하기

  • 기존에는 객체코드가 변경되거나 다른 객체를 사용하려 할떄 xml안의 bean 태그 까지가서 코드를 직접 바꿔야 했다.

  • 이 방법이 너무 불편해 객체를 바꾸면 설정도 저절로 바뀌는게 없나 하면서 나온게 바로 애노테이션 방법이다.

  • 애노테이션은 코드에다가 설정을 심어버리는 방법이다.

@Autowired

  • 쉽게 말해 인젝션 해주는 부분이다.

  • xml에서는 (property 부분 ) -> ioc컨테이너에서 (객체는 생성됫으니) 객체를 찾아서 주입시켜주는 부분

  • setter or 생성자 or setter가 사용하는 속성위에 선언해준다.

  • DI 에는 Setter injection 과 생성자 injection 이 있다는걸 잊지말자

하지만 잠깐!

  • xml property지우고 오토와이어드만 쓰면 오류가 난다. 스프링이 굳이 객체안에 autowired 애노테이션 찾지는 않으니까 스프링에게 @Autowired 찾아사용하라는 코드를 적어 줘야한다.

  • 쉽게말해 스프링이 xml지시서를 읽을떄 property 부분(injection) 부분이 삭제되었으니 주입과정을 할때 애노테이션을 살펴봐 라는뜻의 명령어이다.

@Autowired의 근거

  • XML 은 ref에 id값이 적혀 이 객체를 주입(결합) 시켜줘 라는 근거가 있는데 @Autowired는 어떠한 근거로 객체를 찾아 주입을 시키는거지???

  • 자료형을 기준으로 찾는다. (위의 코드에서는 Exam)

  • 그렇다면 자료형이 같은 객체가 두개 이상이면?? 어떻게 구별을 하는가
    ->@Qualifier

@Qualifer


  • @Autowired의 근거 즉 자료형을 기준으로 객체를 찾는데 그 객체가 두개 이상이면 어떻게 구별하는가??

-> id값으로 구별한다!
-> autowired 는 1순위가 자료타입을 기본으로하고 떄로는 식별 모호하면 변수명도 쓴다 = @Qualifier

@Autowired 위치와 required

  • Autowired는 setter / setter가 사용하는 필드/ 생성자 위에 선언 해준다.

  • 필드위에 생성시 기본생성자가 없으면 오류남

  • 오버로드 생성자까지 없으면 컴파일러가 기본생성자를 생성해서 오류가 없다.

  • 오버로드 생성자는 매개변수가 2개이상 들어갈수 있다 생각해서 Qualifier 오류가남
    -> 각각 파라미터에 직접 @Qualifier 선언해서 사용

@Autowired(required=false)

  • Qualifier 에 대응하는 id 값이 xml에 없을떄, 객체가 없어도 일단 OK

  • 밑에는 null일떄 대응하는 코드를 넣어줘야한다.

profile
호주쉐프에서 개발자까지..

0개의 댓글