@Primary와 @Qualifier 조합
- 근거
- 대부분의 경우에 대한 기본 구현체를 제공하면서, 특정 상황에서 다른 구현체를 선택할 수 있는 유연성을 제공한다.
- 가정
- 대부분의 상황에서는 DefaultClaimProcessor를 사용하지만, 특별한 경우에 ExpeditedClaimProcessor를 사용해야 한다고 가정한다.
- 제한 사항
- @Primary로 지정된 빈은 대부분의 사용 사례에 적합해야 한다.
- 추천 사용법
- @Primary를 사용해 기본 구현체를 제공하고, 특정 케이스에서 @Qualifier를 사용해 명시적으로 다른 구현체를 주입한다.
- 예를 들어, 대부분의 클레임은 표준 방식으로 처리하지만, 긴급 클레임은 별도의 처리기를 사용해야 할 경우 이 방식이 유용하다.
- 예시
@Service
@Primary
class DefaultClaimProcessor : ClaimProcessor {
override fun processClaim(claim: InsuranceClaim) {
// 표준 클레임 처리 로직
}
}
@Service
class ExpeditedClaimProcessor : ClaimProcessor {
override fun processClaim(claim: InsuranceClaim) {
// 긴급 클레임 처리 로직
}
}
@Component
class ClaimHandler {
// 기본적으로 DefaultClaimProcessor가 주입됩니다.
@Autowired
private lateinit var processor: ClaimProcessor
// 긴급 클레임 처리가 필요할 때는 ExpeditedClaimProcessor를 주입받습니다.
@Autowired
fun handleClaim(claim: InsuranceClaim, @Qualifier("expeditedClaimProcessor") expeditedProcessor: ClaimProcessor) {
if (claim.isUrgent) {
expeditedProcessor.processClaim(claim)
} else {
processor.processClaim(claim)
}
}
}
@Profile과 @Autowired 조합
- 근거
- 다른 환경에서 다른 구현체를 자동으로 주입할 수 있기 때문에 환경별 설정을 손쉽게 관리할 수 있다.
- 가정
- 개발 환경에서는 DevClaimProcessor, 프로덕션 환경에서는 ProdClaimProcessor를 사용한다고 가정한다.
- 제한 사항
- 환경 설정 파일을 올바르게 관리하고, 각 환경에 맞게 Profile을 활성화해야 한다.
- 추천 사용법
- 환경별로 다른 빈을 활성화해야 할 때 사용한다.
- 예를 들어, application-dev.properties에서는 개발 환경용 프로세서를, application-prod.properties에서는 프로덕션 환경용 프로세서를 활성화하여 자동으로 주입되도록 구성한다.
- 엣지 케이스
- 환경변수 설정 실수로 잘못된 프로세서가 주입될 위험이 있다.
- 예시
@Service
@Profile("dev")
class DevClaimProcessor : ClaimProcessor {
override fun processClaim(claim: InsuranceClaim) {
// 개발 환경에 특화된 클레임 처리 로직 (추가 로깅 포함)
}
}
@Service
@Profile("prod")
class ProdClaimProcessor : ClaimProcessor {
override fun processClaim(claim: InsuranceClaim) {
// 프로덕션 환경에 최적화된 클레임 처리 로직
}
}
@Component
class ClaimHandler @Autowired constructor(private val processor: ClaimProcessor) {
fun handle(claim: InsuranceClaim) {
processor.processClaim(claim)
}
}
조건부 빈 설정과 프로그래매틱 빈 등록 조합
- 근거
- 복잡한 조건이나 애플리케이션의 상태에 따라 다양한 빈을 주입할 수 있는 매우 유연한 방법이다.
- 가정
- 애플리케이션의 상태나 특정 조건에 따라 다른 ClaimProcessor 구현이 필요하다고 가정한다.
- 제한 사항
- 조건 로직이 복잡해지고, 빈의 생성과 선택 로직을 관리하는 코드가 애플리케이션 전반에 걸쳐 산재할 수 있다.
- 추천 사용법
- 애플리케이션의 상태나 특정 조건에 따라 다른 구현체를 선택해야 할 때 유용하다.
- 예를 들어, 시스템의 부하 상태에 따라 다른 클레임 처리 방식을 선택하거나, 사용자의 권한 수준에 따라 다른 서비스를 제공해야 할 때 이 조합을 사용할 수 있다.
- 엣지 케이스
- 조건이 너무 많거나 복잡해져서 이해하기 어렵거나, 유지보수가 힘들어질 수 있다.
- 예시
@Service
@Profile("dev")
class DevClaimProcessor : ClaimProcessor {
override fun processClaim(claim: InsuranceClaim) {
// 개발 환경에 특화된 클레임 처리 로직 (추가 로깅 포함)
}
}
@Service
@Profile("prod")
class ProdClaimProcessor : ClaimProcessor {
override fun processClaim(claim: InsuranceClaim) {
// 프로덕션 환경에 최적화된 클레임 처리 로직
}
}
@Component
class ClaimHandler @Autowired constructor(private val processor: ClaimProcessor) {
fun handle(claim: InsuranceClaim) {
processor.processClaim(claim)
}
}
'Spring Framework > 의존성 주입(Dependency Injection)' 카테고리의 다른 글
의존성 주입 관리 기법들 소개 (0) | 2023.11.10 |
---|
댓글