[Spring] 의존성 주입

홍건의·2024년 9월 16일
0

스프링 학습

목록 보기
4/5

Dependency Injection

변경에 의해 영향 받는 관계를 의미한다. 변경에 따른 영향이 전파되는 관계.

객체 간의 의존.
i) 객체를 직접 생성
ii) DI의 서비스 로케이터.(의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 걸 의미)

class A {
	private ClassB b;
    
    // 이렇게 주입받는 걸 말한다.
    생성자(ClassB b) {
    	
    }
}

어플리케이션 실행시점(런타임)에 외부에서 실제 구현 객체를 생성하고, 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는것

의존성 주입방법 3가지

(1) 필드 주입

@Autowired
private OwnerRepository owners;

(2) 생성자 주입

@Autowired
public 클래스이름(OwnerRepository ownerRepo) {
}

필수적으로 생성해야 하는 참조 없이는 인스턴스를 만들 수 없게 된다.

생성자가 딱 1개 있으면 @Autowired를 생략해도 자동주입된다.

final을 붙일 수도 있고, 안 붙일 수도 있으나 이점은 해당 클래스 내부에서는 바꿔치기가 불가능하다는 점이다.

(3) setter 주입

@Autowired
public void setOwners(OwnerRepository ownerRepo) {
	this.repo = repo;
}

@Autowired

기본 조회 전략은 (1순위) 타입이 같은 빈을 찾아서 주입한다.

주입하는데 Bean이 존재하지 않는 상황

1) @Autowired(required = false)
아예 수정자 메소드 호출되지 않음

2) org.springframework.lang @Nullable
없으면 null로 처리

3) Optional<>
없으면 Optional.empty (java 문법)

주입하는데 같은 type의 bean이 여러 개인 상황

1) Autowired 필드명 매핑
2) @Qualifier
3) @Primary

@Primary가 사용에는 편리하나 우선순위는 @Qualifier가 더 높다.

동작 방식

기본은 리플렉션을 이용한다.

접근 지시자를 무시하고 필드이름, 필드 값, 메소드, 생성자, 상위클래스를 가져올 수 있다.

클래스를 로딩만해도 바로 사용할 수 있다.

리플렉션 사용 시 지나친 사용은 성능 이슈가 발생할 수 있으므로 주의해야 한다.

profile
Backend Developer

0개의 댓글

관련 채용 정보