[spring] @Bean 선택적 사용 By starseat 2022-09-29 14:46:28 java/spring Post Tags 제목만큼 거창한 방법은 아니지만 설정 파일에 따라 @Bean 을 선택적으로 사용해야 될 때가 있어 내가 해결한 방법을 공유하려 한다. 상황은 이렇다. `Cloud` 용 `API 서버` 개발 중 `Object Storage`를 선택적으로 사용해야 될 필요가 있었다. Upload 모듈을 선택적으로 사용해야 되었기에 이를 해결한 방법을 적어보려 한다. > *정답이 아닌 참고용 입니다!* 1.`application.yml`설정 - `target` 항목으로 `ObjectStorage` 대상 지정 ```yaml ... upload: target: aa # aa, bb aa: endPoint: aa-ep-blablabla~ accessKey: aa-ak-blablabla~ secretKey: aa-sk-blablabla~ bb: endPoint: bb-ep-blablabla~ accessKey: bb-ak-blablabla~ secretKey: bb-sk-blablabla~ ``` 2.Upload 모듈 - `UploadService` ```java public interface UploadService { void uploadFile(String id, MultipartFile uploadFile); void downloadFile(String id, String filepath, String filename); } ``` - `AAUploadService` - `BBUploadService` 도 마찬가지 ```java @Slf4j @Service public class AAUploadService implements UploadService { @Value("${upload.aa.endPoint}") private String endPoint; @Value("${upload.aa.accessKey}") private String accessKey; @Value("${upload.aa.secretKey}") private String secretKey; @Override public void uploadFile(String id, MultipartFile uploadFile) { // ... } @Override void downloadFile(String id, String filepath, String filename) { // ... } } ``` 3.`UploadService` 사용 - `CRUDService` ``` @Slf4j @Service @RequiredArgsConstructor public class CRUDService { @Value("${upload.target}") private String target; private final MongoRepository repository; private UploadService uploadService; private final AAUploadService aaUploadService; private final BBUploadService bbUploadService; @PostConstruct public void init() { log.info("Object Storage Target: {}", target); // aa 를 default 로 지정 if (!ObjectUtils.isEmpty(target) && target.equals("bb")) { this.uploadService = this.aaUploadService; } else { this.uploadService = this.bbUploadService; } } public void insert(Data data) { String newId = repository.insert(data); upload(data); } public void upload(Data data) { // ... uploadService.uploadFile(data.getId(), data.getUploadFile()); } } ``` Previous Post [java] ModelMapper 사용기 Next Post [java] Optional 사용