어떤 경우에 스프링 빈이 없어도 동작해야 할까?
라는 의문에 생각났던 상황은 테스트 코드 그리고 스프링빈이 외부 API에 의존하고 있는데 외부 API가 일정기간 점검중 과 같은 상황이었습니다.
일단, 스프링 빈으로 등록하지 않아도 동작하게 하는 방법은 여러가지가 있습니다.
//호출안됨
@Autowired(required = false)
public void setNoBean1(Member member) {
}
//null 호출
@Autowired
public void setNoBean2(@Nullable Member member) {
}
//Optional.empty 호출
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
}
위의 방법의 용도는 테스트 코드를 작성할 경우를 제외하고 크게 와닿지 않았습니다.
굳이 setter 를 열어줘야하나?🧐 생각도 들고, 제가 해당하는 상황을 만나지 못했기때문이라고 생각합니다.
하지만 @Nullable or Optional은 상황에 따라 사용할만하다고 생각이 듭니다.
외부 API 사용을 가정한 파일 업로드 서비스 예제를 생각했습니다.
이경우는 생성자 주입을 사용합니다.
public interface FileUploadService {
void uploadFile(String filePath);
}
@Service
public class ExternalApiFileUploadService implements FileUploadService {
@Override
public void uploadFile(String filePath) {
// 외부 API를 사용한 파일 업로드 로직 구현
System.out.println("외부 API 파일업로드: " + filePath);
}
}
@Component
public class FileUploadSystem {
private final FileUploadService fileUploadService;
@Autowired
public FileUploadController(@Nullable FileUploadService fileUploadService) {
this.fileUploadService = fileUploadService;
}
public void uploadFile(String filePath) {
if (fileUploadService != null) {
fileUploadService.uploadFile(filePath);
} else {
System.out.println("파일업로드 일시장애로 대체 서비스 작동");
}
}
}
아래는 Map을 사용한 빈 동적주입의 예시 입니다.
@Component
public class FileUploadSystem {
private final Map<String, FileUploadService> fileUploadServiceMap;
public FileUploadController(Map<String, FileUploadService> fileUploadServiceMap) {
this.fileUploadServiceMap = fileUploadServiceMap;
}
@Override
public void uploadFile(String filePath, String flag) {
if (flag.equals("kakao")) {
fileUploadServiceMap.get("kakaoFileUploadService");
} else {
fileUploadServiceMap.get("defaultFileUploadService");
}
}
}