파일을 저장하는 경로를 config.properties
에서 불러오는데 이 값이 계속해서 null
로 지정된다.
없음
.../resource-local/config.properties
file.save.path=/dev/attFile/
img.save.path=
img.access.host=
FileUtil.java
@Slf4j
@Component
public class FileUtil {
@Value("#{config['file.save.path']}")
private String BASE_SAVE_PATH;
private String savePath;
FileUtil() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
savePath += BASE_SAVE_PATH + "/" + year + "" + month + "" + day;
}
public File saveFile(MultipartFile mf) throws IllegalStateException, IOException {
File file = new File(SAVE_PATH);
@Value 애너테이션은 BeanPostProcessor
에 의해 처리되는데 이것이 어떻게 작동하는지를 살펴보자. 다음은 공식 문서의 일부이다.
Customizing Beans by Using a BeanPostProcessor
BeanPostProcessor
instances operate on bean (or object) instances. That is, the Spring IoC container instantiates a bean instance and thenBeanPostProcessor
instances do their work.
Spring IoC 컨테이너는 Bean 인스턴스를 인스턴스화한 다음 BeanPostProcessor
인스턴스가 동작한다고 설명하고 있다.
정리하자면 다음과 같다.
@Value
로 값 불러오기 (BeanPostProcessor
인스턴스가 동작)인스턴스화가 먼저 진행되기 때문에 BASE_SAVE_PATH
가 null
인 상태에서 savePath
값이 null/[date]
로 지정됐던 것이었다.
두 가지 방법이 있다.
@Value
FileUtil.java
@Slf4j
@Component
public class FileUtil {
private String savePath;
FileUtil(@Value("#{config['file.save.path']}") String BASE_SAVE_PATH) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
savePath += BASE_SAVE_PATH + "/" + year + "" + month + "" + day;
}
@PostConstruct
사용@Slf4j
@Component
public class FileUtil {
@Value("#{config['file.save.path']}")
private String savePath;
@PostConstruct
private void addDateToSavePath() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
savePath += "/" + year + "" + month + "" + day;
}