spring

같은 타입의 Bean 충돌 해결(@Qualifier @Primary)

seungmin576 2025. 2. 4. 20:54

1. @Autowired + 필드명 사용

@Autowired 는 타입으로 먼저 주입을 시도하고 같은 타입의 Bean이 여러개라면 필드 이름 혹은 파라미터 이름으로 매칭한다.

public interface MyService { ... }

@Component
public class MyServiceImplV1 implements MyService { ... }

@Component
public class MyServiceImplV2 implements MyService { ... }

@Component
public class ConflictApp {

	// 필드명을 Bean 이름으로 설정
	@Autowired
	private MyService myServiceImplV2;
	...
}

 

 

 

2. @Qualifier 사용

bean 등록 시 추가 구분자를 붙여 준다.

생성자 주입과 setter 주입 시 사용 가능하다.

@Component
@Qualifier("firstService")
public class MyServiceImplV1 implements MyService { ... }

@Component
@Qualifier("secondService")
public class MyServiceImplV2 implements MyService { ... }

@Component
public class ConflictApp {

		private MyService myService;

		// 생성자 주입에 구분자 추가
		@Autowired
		public ConflictApp(@Qualifier("firstService") MyService myService) {
				this.myService = myService;
		}
	
		// setter 주입에 구분자 추가
		@Autowired
		public void setMyService(@Qualifier("firstService") MyService myService) {
				this.myService = myService;
		}
	...
}

 

 

 

3. @Primary 사용

@Primary로 지정된 bean이 우선 순위를 가진다.

@Component
public class MyServiceImplV1 implements MyService { ... }

@Component
@Primary
public class MyServiceImplV2 implements MyService { ... }

@Component
public class ConflictApp {

		private MyService myService;

		@Autowired
		public ConflictApp(MyService myService) {
				this.myService = myService;
		}
	...
}

 

 

 

그래서 언제 써요??

DB가 메인, 보조로 두개 존재하는 경우.

  • 기본적으로 메인DB을 사용할 때 @Primary를 사용한다.
  • 필요할 때 @Qualifier로 보조DB를 사용하도록 만들 수 있다.
  • 동시에 사용되는 경우 @Qualifier의 우선순위가 높다.