<Spring> 의존 자동 주입

라모스·2021년 9월 25일
0

Spring☘️

목록 보기
3/18
post-thumbnail

@Autowired를 이용한 의존 자동 주입

자동 주입 기능을 사용하면 Spring이 알아서 의존 객체를 찾아서 주입한다.
의존을 주입할 대상에 @Autowired 애노테이션을 붙이기만 하면 된다.

import org.springframework.beans.factory.annotation.Autowired;

public class ChangePasswordService {
    
    @Autowired
    private MemberDao memberDao;
    
    public void changePassword(String email, String oldPwd, String newPwd) {
    	Member member = memberDao.selectByEmail(email);
        if (member == null)
        	throw new MemberNotFoundException();
        member.changePassword(oldPwd, newPwd);
        
        memberDao.update(member);
    }
    
    public void setMemberDao(MemberDao memberDao) {
        this.memberDao = memberDao;
    }
}

@Autowird를 붙이면 설정 클래스에서 의존을 주입하지 않아도 된다. 필드에 이 애노테이션이 붙어 있으면 스프링이 해당 타입의 빈 객체를 찾아서 필드에 할당한다.
메소드에도 마찬가지로 @Autowird를 붙일 수 있다. 이 경우, 해당 메소드에 일치하는 타입을 가진 빈이 주입된다.

자동 주입 대상과 일치하는 빈이 없을 때?

@Autowird 애노테이션을 적용한 대상에 일치하는 빈이 없다면, 예외가 발생하면서 제대로 실행되지 않는다.

Exception in thread "main" o ..(중략)
UnsatisfiedDependencyException:
Error creating bean with name 'memberRegSvc':
Unsatisfied dependency expressed through field 'memberDao';
nested exception is o .. (중략).
NoSuchBeanDefinitionException:
No qualifying bean of type 'spring.MemberDao' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

@Autowired를 붙인 MemberRegisterService의 memberDao 필드에 주입할 MemberDao 빈이 존재하지 않아 에러가 발생했다는 내용이다.

@Autowired를 붙인 주입 대상에 일치하는 빈이 두 개 이상일 때도 예외가 발생한다.

@Bean
public MemberPrinter memberPrinter1() {
	return new MemberPrinter();
}

@Bean
public MemberPrinter memberPrinter2() {
	return new MemberPrinter();
}

이 경우 빈이 중복되어 자동 주입을 할 때 어떤 빈을 주입해야 하는지 정확하게 한정이 안되는 문제가 생긴다.

Exception in thread "main" o..(중략)
UnsatisfiedDependencyException: Error creating bean with name 'listPrinter':
Unsatisfied dependency expressed through method 'setMemberPrinter' parameter 0;
nested exception is o.(중략)
NoUniqueBeanDefinitionException: No qualifying bean of type 'spring.MemberPrinter' available:
expected single matching bean but found 2: memberPrinter1, memberPrinter2

@Qualifier를 이용한 의존 객체 선택

자동 주입이 가능한 빈이 두 개 이상이면 자동 주입할 빈을 지정할 수 있는 방법이 필요하다.
@Qualifier 애노테이션을 사용하면 자동 주입 대상 빈을 한정할 수 있다.

  • @Qualifier: 빈의 이름을 한정자로 지정
  • @Qualifier("한정값"): 파라미터에 들어가는 "한정값"으로 빈을 등록

References

profile
Step by step goes a long way.

0개의 댓글