일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- java
- 맛집
- 시작
- 리팩터링
- 변경
- 2차원 리스트
- CodeUP
- 안드로이드
- JDK 8
- 설치
- r
- 27G2
- 자바스크립트
- 안스
- 안드로이드 스튜디오
- python
- spring boot
- 예제
- 파이썬
- 코드업
- JavaScript
- 설정
- 버튼 이벤트
- 에러
- Android Studio
- 자바
- 반복문
- 방법
- 출력
- 점심
Archives
- Today
- Total
기루 기룩 기록
[Spring] @ConfigurationOnProperty 본문
반응형
https://reflectoring.io/dont-use-spring-profile-annotation/
@Profile에 따라 Service인터페이스 구현체를 사용하려고 찾아보던중 발견한 내용입니다.
원래 계획은 아래 샘플과 같이 use 프로파일을 사용할경우 UseService, no일경우 NoService를 사용하는것이였다.
public interface interfaceService {
void test();
}
@Profile("use")
@Service
public class useService implement interfaceService {
@Overide
void test() {
// ...
}
}
@Profile("no")
@Service
public class noService implement interfaceService {
@Overide
void test() {
// ...
}
}
위 블로그에선 이 어노테이션을 사용하면 유지보수가 어렵다는 문제를 얘기했는데 만약 프로젝트를 수정하기 위해 해당 profile이 영향을 주는 범위를 찾는다면 어떻게 해야될까? 상상만해도 어렵다.. 의도를 파악하기도 어려울듯하다.
특정 프로필이 영향을 주는 범위를 한눈에 보기 어렵다 보니 Profile 어노테이션이 사용되는 영역을 하나하나 찾아서 확인해야 된다는 문제가 있다.
블로그에서는 이 문제를 해결하기위해 사용할 수 있는 어노테이션을 소개해줬는데 바로 @ConfigurationOnProperty 이다.
프로퍼티 값에 따라 bean이 생성되며 값이 없을경우 생성되지 않는 어노테이션
"application.test.using" 프로퍼티가 있을 때 해당 값에 따라 다르게 bean을 생성할 수 있다.
...
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfiguration {
@ConditionalOnProperty(name = "application.test.use", havingValue = "true")
class testUseConfiguration {
@Bean
public YesService service() {
return new YesService();
}
}
@ConditionalOnProperty(name = "application.test.use", havingValue = "false")
class testNotUseConfiguration {
@Bean
public NoService service() {
return new NoService();
}
}
}
Test
@AutoConfigureMockMvc
@SpringBootTest
public class ConfigurationOnPropertyTest {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
TestService service;
@Value("${application.test.use}")
String use;
@Test
public void test() {
logger.info("application.test.use: {}", use);
logger.info("service: {}", service.getClass().getName());
}
}
application.test.use가 true일 경우
application.test.use가 false일 경우
반응형