Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

의존관계 주입 방법 본문

인프런/[인프런] Spring 핵심원리 이해

의존관계 주입 방법

Seung__ 2021. 7. 29. 22:09

1. 의존관계 주입 방법


  • 생성자 주입
  • 수정자 주입(setter 주입)
  • 필드 주입
  • 일반 메서드 주입

 

 

2. 생성자 주입.


  • ???? : @Autowired가 있네?
  • 컨테이너에서 같은 타입의 빈 꺼내옴.
  • 집어넣음
  • 특징
    - 생성자 호출 시점에 딲 1번 만 호출되는 것이 보장됨.
    - 불변, 필수 의존관계에 사용--> set을 public으로 열어두면 안됨
      (getter, setter 막만들면 안됨!)
@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
    private final DiscountPolicy discountPolicy; //이렇게하면 인터페이스에만 의존함.

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
  • final로 하면 값이 무조건 있어야함! 직접 지정하거나 생성자 있어야함.
    final : 한 번 값을 넣으면 바뀌지 않음. 말 그대로 final 그러니 무조건 값은 있어함.
  • 만약 생성자가 따악 1개만 있다? @Autowired 생략해도 자동 주입.
  • 생성자 주입은 언제 일어날까?
    - OverServiceImpl을 생성하려면 생성자를 불러야함
    - 즉, 빈을 등록하면서 의존관계 주입 같이 일어남.

 

 

3. 수정자 주입(setter 주입)


  • setter라는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계 주입!
  • 특징
    - 선택, 변경 가능성이 있는 의존관계에 사용. setter는 필드값을 변경하기 때문
    - 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법/
    @Component
    public class OrderServiceImpl implements OrderService{
    
        private  MemberRepository memberRepository;
    
        @Autowired
        public void setMemberRepository(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }​
  • 어떻게 등록되는 거지...?
  • @ComponentScan에 의해 OverderServiceImpl을 스프링 빈으로 등록
  • 스프링 컨테이너가 @Autowired가 걸린 놈을 자동으로 주입함.
  • 스프링 컨테이너 라이프 사이클
    - 스프링 빈 등록
    - 연관관계 주입
  • Setter주입의 경우
    - 스프링 빈 등록 후 연관관계 주입.
  • @Autowired(requited = false)로 지정하면 주입할 대상이 없어도 동작함.
  • 자바빈 프로퍼티
    - 자바에서는 필드의 값을 직접 변경하지 한고, getter, settter를 통해 값을 읽거사 수정함.
    - 이를 자바빈 프로퍼티 규약이라함.

 

 

4. 필드 주입


  • 필드에 바로 때려박아버리기
@Component
public class OrderServiceImpl implements OrderService{

    @Autowired
    private final MemberRepository memberRepository;
  • 코드가 간결하니 좋다.
  • 근데! 필드주입을 권장하지 않는다.. 안티패턴임
  • 외부에서 변경이 불가능해서 테스트 하기 어렵다
    - 만약 더비 repository로 테스트를 하고 싶으면.. setter도 없고.. 무슨 방법이 없다..
    - 굳이 하려면은 setter를 따로 만들어 줘야햠.
    - 그럴 바에야 그냥 setter에 @Autowired걸면됨 ㅋㅋㅋㅋ
  • 쓰지말자
    - 단, application  실제 코드와 관계 없는 스프링 부트 테스트 코드에서 사용. 

 

5. 일반 메서드 주입


  • 일반 메서드를 통해서 주입 받을 수 있다.
  • 한번에 여러 필드를 주입 받을 수 있다.
  • 일반적으로 잘 사용 안함..생성자 주입, setter주입으로 웬만하면 됨..
  @Autowired
    public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
        this.memberRepository = memberRepository;
        this. discountPolicy = discountPolicy;
    }
  • 참고로 의존관계 자동 주입은 스프링 컨테이너가 관리하는 빈이어야 작동한다.
  • 스프링 빈이 아닌 다른 클래스에서 @Autowired하면 아무 것도 안함 ㅋㅋㅋㅋ
Comments