개발/Spring

[스프링] DI(Dependency Injection) 이해하기 - 심화편

이쪽저쪽살짝 2023. 4. 4. 19:43
반응형

스프링 DI 심화: Qualifier와 Primary

앞서 살펴본 DI 예제에서는 인터페이스를 구현하는 클래스가 하나였지만, 실제로는 다양한 구현체가 있을 수 있습니다. 이러한 경우, 구현체를 구분하여 의존성을 주입할 수 있어야 합니다. 스프링에서는 @Qualifier와 @Primary 애노테이션을 사용하여 이러한 문제를 해결할 수 있습니다.

6.1. Qualifier
@Qualifier 애노테이션은 여러 구현체 중에서 특정 구현체를 선택하여 주입할 수 있도록 도와줍니다. 예를 들어, BInterface를 구현하는 B1과 B2 클래스가 있다고 가정합시다. 이 경우, 다음과 같이 @Qualifier 애노테이션을 사용하여 원하는 구현체를 주입할 수 있습니다.

 

// B1.java
@Component("b1")
public class B1 implements BInterface {
    // ...
}

// B2.java
@Component("b2")
public class B2 implements BInterface {
    // ...
}

// A.java
@Component
public class A {
    private BInterface b;

    @Autowired
    public A(@Qualifier("b1") BInterface b) {
        this.b = b;
    }
    // ...
}

6.2. Primary
@Primary 애노테이션은 여러 구현체 중에서 우선순위를 가진 구현체를 지정할 수 있습니다. 이를 통해 기본 구현체를 정의하고, 필요에 따라 다른 구현체로 변경할 수 있습니다. 다음은 @Primary 애노테이션을 사용한 예시입니다.

// B1.java
@Component
@Primary
public class B1 implements BInterface {
    // ...
}

// B2.java
@Component
public class B2 implements BInterface {
    // ...
}

// A.java
@Component
public class A {
    private BInterface b;

    @Autowired
    public A(BInterface b) {
        this.b = b;
    }
    // ...
}

이 예제에서 B1 클래스에 @Primary 애노테이션을 지정하였기 때문에, A 클래스의 생성자에 @Qualifier 애노테이션을 사용하지 않아도 B1 클래스의 인스턴스가 주입됩니다.

7. 스프링 DI의 활용: 프로파일
스프링 프레임워크에서는 프로파일(Profile)을 사용하여 애플리케이션의 실행 환경에 따라 다른 구현체를 주입할 수 있습니다. 예를 들어, 개발 환경에서는 특정 데이터베이스를 사용하고, 운영환경에서는 다른 데이터베이스를 사용하는 경우 프로파일을 활용하여 적절한 구현체를 주입할 수 있습니다.

7.1. 프로파일 설정
프로파일을 사용하려면 먼저 @Profile 애노테이션을 사용하여 구현체에 프로파일을 지정해야 합니다.

// DevelopmentDataSource.java
@Component
@Profile("dev")
public class DevelopmentDataSource implements DataSource {
    // 개발 환경용 구현
}

// ProductionDataSource.java
@Component
@Profile("prod")
public class ProductionDataSource implements DataSource {
    // 운영 환경용 구현
}

7.2. 프로파일 활성화
프로파일을 활성화하려면 애플리케이션 실행 시, 프로파일을 지정해야 합니다. 스프링 부트 애플리케이션의 경우 application.properties 파일에 다음과 같이 프로파일을 설정할 수 있습니다.

spring.profiles.active=dev

또는 애플리케이션 실행 시, 커맨드 라인에서 다음과 같이 프로파일을 지정할 수 있습니다.

java -jar myapp.jar --spring.profiles.active=dev

프로파일을 설정하면, 활성화된 프로파일에 따라 적절한 구현체가 주입되어 실행됩니다. 이를 통해 애플리케이션의 실행 환경에 따른 구성 변경이 용이해집니다.

8. 마치며
이 글에서는 스프링 프레임워크의 핵심 개념인 DI(Dependency Injection)에 대해 알아보았습니다. DI는 객체 간의 의존성을 줄여 코드의 유연성과 재사용성을 높이는 방법입니다. 스프링에서는 XML 설정 파일, 자바 설정 파일, 애노테이션을 사용하여 DI를 구현할 수 있습니다.

또한, DI를 활용하여 프로파일과 같은 기능을 사용하여 실행 환경에 따라 다른 구현체를 주입할 수 있습니다. 이를 통해 애플리케이션의 환경에 따른 구성 변경이 용이해집니다.

이제 스프링의 DI 개념에 대한 기본적인 이해를 갖추셨으니, 앞으로 스프링 프레임워크를 활용하여 다양한 애플리케이션을 개발하시면서 DI의 장점을 체감하실 수 있을 것입니다. 계속해서 스프링 프레임워크에 대한 지식을 쌓아 나가면서 더욱 완성도 높은 애플리케이션 개발에 도전하시기 바랍니다.

반응형