공부/Spring / / 2021. 6. 13. 08:02

[Spring] Chapter 04 - 의존 자동 주입

300x250

 

※ 정리

  • @Autowired 애노테이션을 선언하면, 해당 필드에 해당하는 객체를 찾아서 자동으로 주입을 해준다
  • 해당하는 객체가 두개일 경우, @Qualifier를 사용하면 의존 객체를 선택할 수 있다.
  • 꼭 의존 주입이 필요없는 경우는 @Autowired(required = false)를 사용한다.

 

package chap03.config;

import chap03.spring.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //스프링 설정 클래스
public class AppCtx {

    @Bean //MemberDao라는 이름으로 스프링에 주입
    public MemberDao memberDao(){
        return new MemberDao();
    }

    @Bean
    public ChangePasswordService changePwdSvc(){
        ChangePasswordService pwdSvc = new ChangePasswordService();
        pwdSvc.setMemberDao(memberDao()); // 의존주입
        return pwdSvc;
    }

}

 

위 코드에서 객체로 등록한 changePwdSvc() 에서 memberDao()를 의존 주입하고 있다.

 

 

의존 자동 주입 (@Autowired)


 

 

- @Autowired를 필드에 붙이면 설정 파일에서 해당 타입의 빈 객체를 찾아서 필드에 할당한다.

- 필드에 자동으로 memberDao를 주입했기 때문에 설정파일에서는 의존 주입을 해주지 않아도 된다.

 

    @Bean
    public ChangePasswordService changePwdSvc(){
        ChangePasswordService pwdSvc = new ChangePasswordService();
        //pwdSvc.setMemberDao(memberDao()); // 자동으로 의존 주입이 됬으니 삭제해도 됌
        return pwdSvc;
    }

 

 

ㅁ @Autowired 주입 대상에 일치하는 빈이 두개 이상이면?? 

 

 - 의존 타입의 객체가 여러개이면 자동 주입에 실패하고 익셉션이 발생된다.

 - 자동 주입을 하려면 해당 타입을 가진 빈이 어떤 빈인지 정확하게 한정할 수 있어야한다.

 

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

 

 

 

ㅁ @Qualifier 의존 객체 선택

 - @Qualfier로 자동 주입할 빈을 지정 가능하다.

 

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

- 자동 주입 시 @Qualfier 애노테이션을 사용해서 printer라는 값을 설정

- 설정파일에서 빈으로 등록 된 객체 중 @Qualiter이 printer로 선언 된 함수를 찾아 실행된다.

 

 

ㅁ @Autowird 필수 여부 

- ( @Autowired(required = false))

 

package chap04.spring;

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

import java.time.format.DateTimeFormatter;
import java.util.Optional;

public class MemberPrinter {
    private DateTimeFormatter dateTimeFormatter;

    public MemberPrinter() {
        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
    }

    public void print(Member member) {
        if (dateTimeFormatter == null) { //null인 경우에도 알맞게 동작되기 때문에 setDataFormatter()을 통해서 의존 객체를 주입할 필요는 없다
            System.out.printf(
                    "회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%tF\n",
                    member.getId(), member.getEmail(),
                    member.getName(), member.getRegisterDateTime());
        } else {
            System.out.printf(
                    "회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%s\n",
                    member.getId(), member.getEmail(),
                    member.getName(),
                    dateTimeFormatter.format(member.getRegisterDateTime()));
        }
    }

    public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
        this.dateTimeFormatter = dateTimeFormatter;
    }
}

 

print() 함수를 살펴 보면 dataTimeFormatter이 null인 경우에도 알맞게 동작되기 때문에 setDataFormatter()을 통해서 의존 객체를 주입할 필요는 없다. 하지만 @Autowired의 경우는 해당하는 빈이 꼭 존재해야 하므로 익셉션이 발생된다.

 

오류 발생

 

 

- 꼭 자동 주입할 대상이 필수가 아닌 경우는 자동 주입 속성을 flase로 지정한다.

- 매칭되는 빈이 없어도 익셉션이 발생하지 않고 자동 주입을 수행하지 않는다.

 

    @Autowired(required = false)
    public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
        this.dateTimeFormatter = dateTimeFormatter;
    }

 

 

결과 보면 문제 없음

 

REFERENCE


 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)

300x250
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유