[JAVA] 전략 패턴에서 bean이 여러개일때 yml의 프로퍼티 값으로 원하는 클래스 의존성 주입하기

jihun Choi·2023년 9월 18일
0

안녕하세요 오늘은 전략패턴에서 interface를 상속받은 클래스가 여러개일때 yml 프로퍼티 값으로 원하는 클래스을 의존성 주입하는 작업을 진행해보록 하겠습니다.


😎 전략 패턴이란?

디자인 패턴의 한 종류로써, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여
객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다. 예를들어 sms 문자를 보내주는 클래스를 만들때 행위를 interface로 정의하고 sk, lg등 회사에 따른 세부적인 동작은 interface를 상속받아 class로 정의해주는 방식입니다.

개발을 진행하다보면 yml파일에 프로퍼티값으로 어떤 클래스를 사용할지 제어할때가 있습니다 이때 사용하는 어노테이션이 @ConditionalOnProperty 입니다

😎 @ConditionalOnProperty?

환경설정값에 따라 조건부로 일부 빈만 생성해주는 어노테이션입니다 어노테이션 속성값으로는 name과 havingValue를 보통 사용하며 name은 환경설정의 key값이며 havingValue 환경설정의 value값입니다 value값에 따라 조건부로 빈이 생성됩니다

😎 @ConditionalOnProperty 예제

테스트를 위해 interface 하나와 interface를 상속받는 class를 여러개 생성합니다.

ExService.java

public interface ExService {
    String getValue();
}

ExServiceTest1.java

@Service
@ConditionalOnProperty(name = "pattern.test", havingValue = "test1")
public class ExServiceTest1 implements ExService {
    @Override
    public String getValue() {
        return "test1";
    }
}

ExServiceTest2.java

@Service
@ConditionalOnProperty(name = "pattern.test", havingValue = "test2")
public class ExServiceTest2 implements ExService {
    @Override
    public String getValue() {
        return "test2";
    }
}

ExServiceTest3.java

@Service
@ConditionalOnProperty(name = "pattern.test", havingValue = "test3")
public class ExServiceTest3 implements ExService {
    @Override
    public String getValue() {
        return "test3";
    }
}

위 코드와 같이 yml파일에 있는 pattern.test의 value값에 따라 조건부 빈을 생성하는 @ConditionalOnProperty 어노테이션을 셋팅해줍니다

application.yml

pattern:
  test: test2

이후 application.yml 파일에 pattern.test의 값을 test2로 설정해줍니다.

public class ExController {

    @Autowired
    private ExService exService;

    @GetMapping("")
    public void main(){
        System.out.println(exService.getValue());
    }

}

인터페이스로 변수를 선언하고 autowired를 해서 ExServiceTest2가 주입되는지 확인하고 getValue() 메소드로 결과값 test2가 출력되는지 확인합니다.

정상적으로 test2값이 출력되는것을 확인할수 있었습니다. 다음에는 더 재미있는 소재로 찾아뵙겠습니다 감사합니다.

profile
성장을 위해 열심히 노력하는 개발자 입니다

0개의 댓글