org.springframework.core.io.Resource
java.net.URL
을 추상화했다. → java.net.URL을 Spring core io Resource로 감싼 것java.net.URL
에는 classpath를 기준으로 리소스를 읽어오는 기능이 없었다.java.net.URL
에는 ServletContext를 기분으로 상대 경로를 읽어오는 기능이 없었다.Resource의 타입은 location 문자열과 ApplicationContext 타입에 따라 결정된다.
예시
리소스 로더에 prefix classpath:/
가 있을 때
AnnotationConfigServletWebServerApplicationContext
ClassPathResource
@Autowired
ApplicationContext resourceLoader;
@Override
public void run(ApplicationArguments args) throws Exception {
// 리소스 로더 타입은 class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
System.out.println("resourceLoader.getClass() : " + resourceLoader.getClass());
Resource resource = resourceLoader.getResource("classpath:/test.txt");
// 리소스 타입은 class org.springframework.core.io.ClassPathResource
System.out.println("resource.getClass() = " + resource.getClass());
}
리소스 로더를 prefix 없이 받을 때
리소스 로더의 타입은 AnnotationConfigServletWebServerApplicationContext
해당 리소스 타입은 ServletContextResource
→ 디폴트로 ServletContextResource로 받는다.
@Autowired
ApplicationContext resourceLoader;
@Override
public void run(ApplicationArguments args) throws Exception {
// 리소스 로더 타입은 class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
System.out.println("resourceLoader.getClass() : " + resourceLoader.getClass());
Resource resource = resourceLoader.getResource("test.txt");
// 리소스 타입은 class org.springframework.core.io.ServletContextResource
System.out.println("resource.getClass() = " + resource.getClass());
}
따라서 Resource의 경로를 작성할 때는 Prefix를 사용하는 것을 권장한다. (명시적이고 가시성 좋음)
org.springframework.validation.Validator
객체를 검증하기 위해 사용하는 인터페이스 이다.
애노테이션을 사용하여 객체를 검증한다.
boolean* supports(Class<?> clazz)
: 어떤 객체를 검증할 것인지 정의void validate(Object target, Errors errors)
: 실제 검증 로직을 구현