본문 바로가기

프로그래밍/Spring

[spring] 의존 자동 주입

Overview

목적

의존 자동 주입에 대해 요약 설명 할 수 있어야 한다.

의존 자동 주입이란?

  1. 의존 대사을 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체를 주입하는 것
  2. 스프링에서 의존 자동 주입을 설정하려면 @Autowired, @Resource, @Inject 애노테이션을 사용

@Autowired 애노태이션을 이용한 의존 자동 주입

자동 주입 기능을 사용하면 스프링이 알아서 의존 객체를 찾아서 주입한다. 예를 들어 자동 주입을 사용하면 아래 코드 처럼 설정에 의존 객체를 명시하지 않아도 스프링이 필요한 의존 빈 객체를 찾아서 주입한다

 

의존 자동 주입 전

@Bean

public MemberDao memberDao{
	return new MemberDao();
}

@Bean
public ChangePasswordService changePwdSvc{
	ChangePasswordService pwdService = new ChangePasswordService();
    pwdService.setMemberDao(memberDao());
    return pwdService;
}

의존 자동 주입 후

@Bean
public MemberDao memberDao{
	return new MemberDao();
}

@Bean
public ChangePasswordService changePwdSvc{
	ChangePasswordService pwdService = new ChangePasswordService();
	return pwdService;
}

@Autowired 설정한 타입의 빈객체를 주입해 준다.

  1. @Autowired는 메서드에도 붙일 수 있다. 빈 객체의 메서드에 @Autowired 애노테이션을 붙이면 스프링은 해다 메서드를 호출한다. 이때 메서드 파라미터 타입에 해당하는 빈 객체를 찾아 인자로 주입한다.
  2. @Autowired를 필드나 세터 메서드에 붙이면 스프링은 타입이 일치하는 빈객체를 찾아서 주입한다.
  3. 일치하는 빈이 없는 경우나 두개 이상일 경우 에러 발생

@Qualifier 애노테이션을 이용한 의존 객체 선택

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

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

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

@Autowired
@Qualifier("printer")
	public void setMemberPrinter(MemberPrinter printer){
	this.printer = printer;
}

필드와 메서드에도 적용 가능

@Qualifier 애노테이션이 없으면 필드나 파라미터 이름을 한정자로 사용한다

상위/하위 타입 관계와 자동 주입

@Autowired 애노테이션의 필수 여부

  1. 자동 주입할 대상이 필수가 아닌 경우에는 @Autowired 애노테이션의 required 속성을 다음과 같이 false로 지정하면 된다. @Autowired(required = false) public void setDateFormatter(DateTimeFormatter dateTimeFormatter){ this.dateTimeFormatter = dateTimeFormatter; }
  2. 스프링 버전 5부터는 @Autowired(required = false) 대신 Optional 사용가능 @Autowired public void setDateFormatter(Optional<DateTimeFormatter> dateTimeFormatter){ }
  3. @Nullable 애노테이션 사용 @Autowired public void setDateFormatter(@Nullable DateTimeFormatter dateTimeFormatter){ } @Autowired 애노테이션을 붙인 세터 메서드에서 @Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면, 스프링 컨테이너는 세터 메서드를 호출할 때 자동 주입할 빈이 존재하면 해당 빈을 인자로 전달하고, 존재하지 않으면 null로 전달한다.
  4. @Autowired(required = false)와 @Nullabe의 차이점 @Nullable은 자동 주입할 빈이 존재하지 않아도 메서드가 호출 되지만 @Autowired의 경우 required속성이 false인데 대상 빈이 존재하지 않으면 세터 메서드를 호출하지 않는다.

Tip.

자동 주입을 하는 코드와 수동으로 주입하는 코드가 섞여 있으면 주입을 제대로 하지 않아서 NullPointerException이 발생했을 때 원인을 찾는데 오랜 시간이 걸릴 수 있다. 의존 자동 주입을 사용한다면 일관되게 사용해야 이런 문제가 줄어든다. 의존 자동 주입을 사용하고 있다면 일부 자동 주입을 적용하기 어려운 코드를 제외한 나머지 코드는 의존 자동 주입을 사용하자.

 

참고 서적

www.yes24.com/Product/Goods/62268795

 

스프링5 프로그래밍 입문

스프링 프레임워크의 버전업으로 개선된 내용을 담았다. 처음 스프링을 배우고자 하는 독자들이 입문할 때 필요한 것은 스프링의 방대한 내용이 아닌 기초와 전반적인 흐름을 잡아주는 것으로

www.yes24.com

 

'프로그래밍 > Spring' 카테고리의 다른 글

[spring] 빈 라이프사이클과 범위  (0) 2021.04.15
[spring] 컴포넌트 스캔  (0) 2021.04.12
[spring] 의존 주입 DI  (0) 2021.04.12
[spring] 깃허브(GitHub) 연동  (0) 2021.02.03
[spring] 프로젝트 생성  (0) 2021.02.02