의존관계 자동 주입

HUSII·2023년 1월 18일
0

스프링

목록 보기
6/8

의존관계 주입은 크게 4가지 방법이 있다.
생성자 주입
수정자 주입(setter 주입)
필드 주입
메서드 주입


생성자 주입의 특징은,
생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
불변(final), 필수 의존관계에 사용한다.

생성자가 딱 1개 있다면 @Autowired를 생략해도 자동 주입된다. - 스프링 빈에만 해당


수정자 주입은
선택, 변경 가능성이 있는 의존관계에 사용한다.


필드 주입
필드에서 바로 주입하는 방법(매개변수 선언할때 바로 주입하는 것)

코드가 간결하지만, 테스트하기 힘들다는 치명적인 단점이 있다.
DI 프레임워크가 없으면 아무것도 할 수 없다.
-> 웬만하면 쓰지말자


메서드 주입
일반 메서드를 이용해서 주입하는 것
-> 일반적으로 잘 사용하지 않음


그냥 생성자 주입을 사용하자!

생성자 주입을 사용하면 final 키워드를 사용할 수 있다. 그래서 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.


생성자를 선언하고 @Autowired를 세팅해주는데 롬북을 사용하면 좀더 간결해진다.

롬북 사용전

@Component
public class MemberService {
	private final MemberRepository memberRepository;
    
    @Autowired
    public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}
}

롬북 사용후

@Component
@RequiredArgsConstructor
public class MemberService {
	private final MemberRepository memberRepository;
}

조회 빈이 2개 이상일때

@Autowired는 타입으로 조회한다.
타입으로 조회하기 때문에

ac.getBean(MemberRepository.class)

코드와 유사하게 동작한다.

여기서 MemberRepository의 구현 객체를 @Component로 2개 이상 선언한다면, 의존관계 자동 주입을 실행하면 NoUniqueBeanDefinitionException 오류가 발생한다.
이러한 문제를 해결하는 방법은 대표적으로 2가지가 있다.


@Primary

@Component를 이용해서 빈으로 등록할때 @Primary를 선언해두면, 의존관계가 주입될때 먼저 주입되도록 우선순위를 설정할 수 있다.

자동으로 등록되는 방법이다.


@Qualifier

주입시 추가적인 방법을 제공하는 것, 빈 이름을 변경하는 것은 아님

빈 등록시 @Qualifier를 붙여준다.

@Component
@Qualifire("mr1")
public class MemberRepository1 implements MemberRepository { ''' }

'''

@Autowired 
public Test(@Qualifier("mr1")MemberRepository memberReopository){
'''
}

직접 수동으로 등록하는 방법이다.


자동등록 vs 수동등록

@Component는 자동으로 등록되는 방법이고
@Bean은 수동으로 등록하는 방법이다.

이 두개가 겹쳤을때는 당연히 수동등록이 우선권을 가진다.

그러면 어떤 방법을 사용하는 것이 좋을까,

일단은 자동등록을 기본으로 사용하자.

애플리케이션에 광범위하게 미치는 기술 지원 객체는 수동 빈으로 등록해서, 설정 정보에 바로 나타나게 하는 것이 유지보수 하기 좋다.

profile
공부하다가 생긴 궁금한 것들을 정리하는 공간

0개의 댓글