스프링 프레임워크 (7) 어노테이션

넙데데맨·2022년 4월 25일
0
post-thumbnail

어노테이션

클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할

어노테이션 사용법

  1. Namespace Context 추가
  2. <context:annotation-config/> 추가
  3. 객체들의 Annotation을 자동으로 찾게된다

@Autowired

@Autowired를 통해 필요한 객체를 스프링이 알아서 주입해준다.
console.java

	@Autowired
	@Override
	public void setExam(Exam exam) {
		System.out.println("setter");
		// TODO Auto-generated method stub
		this.exam = exam;
	}

setting.xml

<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" p:math="10" p:com="10"/>

문제 1

알아서 주입해주는 것 까진 좋은데 뭘 기준으로 가져올까?

1. bean 태그의 아이디

아이디를 생성자의 변수 이름과 다르게 바꾸거나 지워도 주입이 잘 되는 것을 알수 있었다.

	@Autowired
	@Override
	public void setExam(Exam exam) {
		// TODO Auto-generated method stub
		this.exam = exam;
<bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>

2. 같은 복수의 객체를 만들 시

모호하기 때문에 자동으로 주입이 불가능하다는 내용
expected single matching bean but found 2:

	<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
	<bean class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20"/>

변수명과 같게 이름을 만들어주었더니 실행이 가능했다.

	<bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
	<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20"/>

하지만 변수명과 다르게 이름을 만들어주었더니 실행이 불가능했다.

참고할 아이디를 정해줄 순 없는 걸까?!
-> @Qualifier 사용

@Qualifier

InlineExamConsole.java

	@Autowired
	@Qualifier("exam2") // Qualifier에 해당되는 ID를 선택해 직접 연결해 줄 수 있다.
	@Override
	public void setExam(Exam exam) {
		// TODO Auto-generated method stub
		this.exam = exam;
	}

setting.xml

	<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
	<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20"/>

또 다른 사용법

InlineExamConsole.java

	@Autowired
	@Qualifier("exam2")
	private Exam exam;
  1. setter 함수가 아닌 private한 필드에 해당 어노테이션을 사용하면 어떻게 될까?
    -> 해당 객체의 기본 생성자만 호출하게된다. 기본 생성자에 사용해도 마찬가지.

  2. 그렇다면 오버로드된 생성자에 사용하면?
    -> 오버로드된 생성자에는 인자가 2개 이상일 수 있다. 이럴 경우 지정된 @Qualifier를 어떤 인자에 사용할 지 모호하기 때문에 직접 필드에 사용하여 해결한다.

오류가 발생하는 모습

	public InlineExamConsole(@Qualifier("exam2")Exam exam) {
		System.out.println("overloaded constructor");
		this.exam = exam;
	}

문제 2

해당하는 객체가 존재하지 않을 때를 가정하고 싶을 떄

@Autowired(required) 이용

@Autowired(required=false)를 사용하면 null값으로도 사용이 가능하다

알게 된 점

  1. @Autowired 사용 시 의존 관계를 자동으로 연결해 빈을 주입해준다.
  2. @Autowired를 사용할 때 같은 타입 Bean이 있을 시 Bean의 ID를 setter함수의 변수명과 같게 할 시 주입할 수는 있지만 권장되지 않는다.
  3. 같은 타입 Bean이 있을 시 @Qualifier를 사용해 불러올 Bean ID를 설정해 혼란을 막는다.
  4. @Autowired 사용 시 객체가 null일 경우를 가정하고 싶다면 (required = false) 사용
profile
차근차근

0개의 댓글