java.net.URL 이라는 클래스를 org.springframework.core.io.Resource라는 클래스로 감싸서 실제 low 레벨에 있는 Resource에 접근하는 기능을 만든 것
Resource 자체를 추상화 시킨 것이다.(가져오는 방법은 ResourceLoader를 사용한다 https://velog.io/@max9106/Spring-ResourceLoader-c6k5tz9x6e)
Resource 객체는 여러가지 메서드가 있다.
exists(): 존재하는 지 여부 확인
isOpen(): 열 수 있는 지 확인
getDescription(): 파일이름, 실제 URL
이외에도 여러가지 메서드들이 존재한다.
Resource의 구현체도 여러가지가 있다.
UrlResource: 기본으로 지원하는 프로토콜(http, https, ftp etc)
ClassPathResource: classpath 접두어 사용
FileSystemResource
ServletContextResource: 가장 많이 사용
리소스를 읽어올 때, ApplicationContext의 타입에 따라 어떤 구현체로 resolving 되는지 결정된다.
만약 var context = new FileSystemXmlApplicationContext("~~.xml");
이 ApplicationContext 타입을 사용하면 FileSystemResource로 resolving 되는 것이다.
ApplicationContext 타입에 상관없이 Resource타입을 강제하고 싶을 땐 접두어를 사용해주면 된다.(접두어를 사용하지 않으면 ServletContextResource로 Resouce 타입이 정해진다)
어플리케이션에서 사용하는 객체들을 검증할 때 사용하는 인터페이스이다.
이 인터페이스를 구현하려면 2가지 메서드를 구현해주어야한다.
supports 메서드: 검증해야하는 인스턴스의 클래스가 validator가 지원하여 검증할 수 있는 클래스인지 확인하는 메서드
validate 메서드: 실질적으로 검증작업이 일어나는 곳
내부에 id와 title이라는 값을 가지고 있는 Event라는 클래스가 있다고 할 때, title 값이 비어있으면 안된다는 조건이 있을 때, validator를 사용할 수 있다.
내부에 id와 title이라는 값을 가지고 있는 Event라는 클래스를 아래와 같이 만들어 줄 수 있다.
title 값이 비어있으면 안되기 때문에 Validator를 만들어 준다. 위에서 말한 것 처럼 supports와 validate 두 가지 메서드를 구현해주어야한다.
supports 메서드에서 파라미터로 전달되는 aClass의 타입이 우리가 임의로 만들어준 클래스인지 확인해준다.
실제로 검증작업이 일어나는 validate에는 rejectIfEmptyOrWhiteSpace를 사용하여, 비어있으면 안된다는 걸 나타내준다.
(field는 event객체의 String title;
을 가리키고, errorCode는 에러(여기서는 title값이 비어있을 때 에러 발생)가 났을때, 그 에러를 나타내는 key값이다.)
title에 값을 넣어주지 않고, 메인에서 실행해보면,
error가 발생하므로, true가 출력된다.
아까 설정해준 errorCode(notempty)에서 파생된 errorCode값들도 출력되고, defaultMessage 값도 마찬가지로 출력됨을 볼 수 있다.
요즘에는 위의 방식보다는 어노테이션을 사용한 방법을 더 많이 사용한다.
Validator를
EventValidator eventValidator = new EventValidator();
이렇게 직접 생성하는 대신, 의존성 주입을 받고,
@Autowired
Validator validator;
주입받은 validator의 validate 메서드로 검증한다.
validator.validate(event, errors);
검증받는 event 객체에는 여러 어노테이션을 사용하여, 검증작업을 거친다.